如何在Hive中向复杂数据类型"Struct"插入数据

8

我是完全不会 Hive 和 Stack Overflow 的。我正在尝试在 Hive 中使用复杂数据类型 "STRUCT" 创建表,并使用 INSERT INTO TABLE 填充。

我正在使用以下代码:

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;

我收到了以下错误信息:
编译语句时出错:FAILED: semanticException [Error 10044]: 无法插入目标,因为列编号类型不同 'struct_test': 无法将列0从结构体转换为数组。
我曾成功地使用类似的代码来创建和填充数据类型数组,但在处理结构体时遇到了困难。 我尝试了很多在网上找到的代码示例,但似乎没有一个适用于我...我真的很需要帮助,因为我已经陷入困境很长一段时间了!谢谢。

注意,空值需要更多的努力 https://issues.apache.org/jira/browse/HIVE-4022 - Chris
5个回答

10

在Hive中,您无法直接插入复杂的数据类型。对于插入结构体,您需要使用名为named_struct的函数。您需要创建一个虚拟表格,并将您想要插入到所需表格的结构列中的数据放入其中。就像在您的情况下创建一个虚拟表格。

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;

你只需要返回翻译后的文本,不需要from子句。 - Flamma
我确认,FROM子句是不必要的,只会使一切变得复杂。也许在旧版本的Hive中是必需的。 - pavel_orekhov

10

您的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;

请问您测试的是哪个版本的Hive? - sandeep rawat
@sandeeprawat,我在hive-0.11.0和hive-2.0.0上测试了这个SQL,它运行良好。 - aaronshan
@aaronshan,你的答案完美地解决了我的问题,非常感谢!这个问题让我痛苦了好几个小时!我相信我正在使用Hive版本1.1.0。 - data101
@data101,欢迎您。您可以投票给我的答案吗? - aaronshan
@aaronshan 我很想帮忙,但我尝试点击向上箭头图标时,它说我的声望需要达到15或更高才能公开投票...我认为因为我是 Stack Overflow 的新手,我需要先获得更多的赞成票才能投票。除非你知道其他方法,我会很乐意! - data101
显示剩余2条评论

5
无需创建任何虚拟表格:只需要使用以下命令:
insert into struct_test
select named_struct("houseno","house_number","streetname","xxxy","town","town_name","postcode","postcode_name");

0
CREATE TABLE IF NOT EXISTS sunil_table(
id INT,
name STRING,
address STRUCT<state:STRING,city:STRING,pincode:INT>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '.';

INSERT INTO sunil_table  1,"name" SELECT named_struct(
"state","haryana","city","fbd","pincode",4500);???

如何将普通数据和复杂数据同时插入表中


目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

0

可能:

你必须从虚拟表或其他表中以句子形式给出列名。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接