How do you insert data into complex data type "Struct" in Hive

21,356

Solution 1

your sql error. you should use sql:

INSERT INTO TABLE struct_test 
       SELECT NAMED_STRUCT('houseno','123','streetname','GoldStreet', 'town','London', 'postcode','W1a9JF') AS address 
           FROM dummy_table LIMIT 1;

Solution 2

You can not insert complex data type directly in Hive.For inserting structs you have function named_struct. You need to create a dummy table with data that you want to be inserted in Structs column of desired table. Like in your case create a dummy table

CREATE TABLE DUMMY ( houseno:    STRING
           ,streetname: STRING
           ,town:       STRING
           ,postcode:   STRING);

Then to insert in desired table do

INSERT INTO struct_test SELECT named_struct('houseno',houseno,'streetname'
                  ,streetname,'town',town,'postcode',postcode) from dummy;

Solution 3

No need to create any dummy table : just use command :

insert into struct_test
select named_struct("houseno","house_number","streetname","xxxy","town","town_name","postcode","postcode_name");
Share:
21,356
data101
Author by

data101

Updated on January 08, 2020

Comments

  • data101
    data101 over 4 years

    I'm completely new to Hive and Stack Overflow. I'm trying to create a table with complex data type "STRUCT" and then populate it using INSERT INTO TABLE in Hive.

    I'm using the following code:

    CREATE TABLE struct_test
    (
     address STRUCT<
                    houseno:    STRING
                   ,streetname: STRING
                   ,town:       STRING
                   ,postcode:   STRING
                   >
    );
    
    INSERT INTO TABLE struct_test
    SELECT NAMED_STRUCT('123', 'GoldStreet', London', W1a9JF') AS address
    FROM dummy_table
    LIMIT 1;
    

    I get the following error:

    Error while compiling statement: FAILED: semanticException [Error 10044]: Cannot insert into target because column number type are different 'struct_test': Cannot convert column 0 from struct to array>.

    I was able to use similar code with success to create and populate a data type Array but am having difficulty with Struct. I've tried lots of code examples I've found online but none of them seem to work for me... I would really appreciate some help on this as I've been stuck on it for quite a while now! Thanks.

  • sandeep rawat
    sandeep rawat over 7 years
    could you please let us know which version of hive you have tested it .
  • aaronshan
    aaronshan over 7 years
    @sandeeprawat, I test this sql on hive-0.11.0 and hive-2.0.0. It works fine.
  • data101
    data101 over 7 years
    @aaronshan, your answer worked perfectly, thank you so much this problem had caused me hours of pain! I believe I'm using Hive version 1.1.0.
  • aaronshan
    aaronshan over 7 years
    @data101 you are welcome. Can u vote to my answer?😜
  • data101
    data101 over 7 years
    @aaronshan I'd love to but I tried to push the upward arrow icon and it said I need a reputation of 15 or more for my up votes to be public... I think because I'm new to Stack Overflow I need to get more up votes for myself before I can vote. Unless you know another way I'd be happy to!
  • data101
    data101 about 7 years
    @aaronshan.... I finally got enough reputation to upvote so I just plus oned you!
  • Flamma
    Flamma about 4 years
    the select can be more simple, if you remove the last part, from the AS: INSERT INTO TABLE struct_test SELECT NAMED_STRUCT('houseno','123','streetname','GoldStreet', 'town','London', 'postcode','W1a9JF')
  • Flamma
    Flamma about 4 years
    you don't need the from clause.