如何将数据插入hive中的复杂数据类型“struct”

8yoxcaq7  于 2021-05-29  发布在  Hadoop
关注(0)|答案(4)|浏览(761)

我对Hive和堆栈溢出是完全陌生的。我试图创建一个具有复杂数据类型“struct”的表,然后使用 INSERT INTO TABLE 在Hive里。
我使用以下代码:

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;

我得到以下错误:
编译语句时出错:失败:semanticexception[error 10044]:无法插入到目标中,因为列号类型与“struct\u test”不同:无法将列0从struct转换为array>。
我能够成功地使用类似的代码来创建和填充数据类型数组,但在使用struct时遇到了困难。我试过很多在网上找到的代码示例,但是没有一个适合我。。。我真的很感谢一些帮助,因为我已经坚持了很长一段时间了!谢谢。

ars1skjm

ars1skjm1#

有可能:
必须在dummy或其他表的语句中指定列名。

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

或者

INSERT INTO TABLE struct_test
SELECT NAMED_STRUCT('houseno',tb.col1,'streetname',tb.col2, 'town',tb.col3, 'postcode',tb.col4) AS address 
 FROM table1 as tb
2w2cym1i

2w2cym1i2#

无需创建任何虚拟表:只需使用命令:

insert into struct_test
select named_struct("houseno","house_number","streetname","xxxy","town","town_name","postcode","postcode_name");
hsgswve4

hsgswve43#

不能直接在配置单元中插入复杂数据类型。要插入结构,必须使用名为\u struct的函数。您需要创建一个虚拟表,其中包含要插入到所需表的structs列中的数据。比如在你的例子中创建一个虚拟表

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

然后插入到所需的表中

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

qij5mzcb4#

您的sql错误。您应该使用sql:

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

相关问题