如何向Hive 2中含Struct复杂类型的表插入数据?
解决Hive嵌套结构表的数据插入问题
我来帮你搞定这个Hive插入数据的问题!先给你拆解原语句里的几个关键错误,再给你两种常用场景下的正确写法。
原语句的问题分析
- 语法混用错误:你同时写了
VALUES('2018-05-31')和嵌套SELECT,Hive不允许这种混合写法——要么用VALUES插入固定值,要么用SELECT从其他表查询插入,二者只能选其一。 - 关键字冲突:
case是Hive的保留关键字,不管作为字段名还是表名,都必须用**反引号(`)**包裹,否则会直接触发语法报错。 - 冗余嵌套写法:不需要为每个结构体单独写一个
SELECT,直接在主查询里用NAMED_STRUCT生成结构体即可。
场景1:从已存在的person/activity/case表关联插入
既然你已经有结构匹配的三张业务表,我们可以通过关联查询(根据实际业务逻辑调整关联条件)生成嵌套结构体,再插入到warehouse表中:
-- 注意:case是关键字,表名和字段名都要加反引号 INSERT INTO TABLE warehouse SELECT -- 可以用固定时间,也可以从业务表取对应时间字段,比如c.create_time '2018-05-31' TIMESTAMP AS time, -- 将person表字段组装成目标结构体 NAMED_STRUCT('id', p.id, 'name', p.name, 'organization', p.organization) AS person, -- 将activity表字段组装成目标结构体 NAMED_STRUCT('id', a.id, 'name', a.name) AS activity, -- 将case表字段组装成目标结构体,字段名case必须加反引号 NAMED_STRUCT('id', c.id, 'name', c.name, 'organization', c.organization) AS `case` FROM `case` c -- 根据你的业务逻辑调整关联条件,比如按业务ID关联 JOIN person p ON c.id = p.id JOIN activity a ON c.id = a.id;
如果三张表不需要关联,只是想各取一条数据插入,可以用LIMIT 1搭配子查询:
INSERT INTO TABLE warehouse SELECT '2018-05-31' TIMESTAMP AS time, (SELECT NAMED_STRUCT('id', id, 'name', name, 'organization', organization) FROM person LIMIT 1) AS person, (SELECT NAMED_STRUCT('id', id, 'name', name) FROM activity LIMIT 1) AS activity, (SELECT NAMED_STRUCT('id', id, 'name', name, 'organization', organization) FROM `case` LIMIT 1) AS `case` FROM dual;
场景2:插入单条测试数据
如果只是想插入一条固定值的测试数据,直接用VALUES语法,把所有字段(包括嵌套结构体)放在同一个括号内即可:
INSERT INTO TABLE warehouse VALUES ( '2018-05-31' TIMESTAMP, NAMED_STRUCT('id', 1, 'name', 'Alex', 'organization', 'CITI'), NAMED_STRUCT('id', 1, 'name', 'Buy'), NAMED_STRUCT('id', 1, 'name', 'Gold', 'organization', 'London') );
额外注意事项
- 确保你的Hive版本支持
NAMED_STRUCT函数(Hive 0.8及以上版本都支持) - 所有Hive保留关键字作为标识符时,一定要用反引号包裹,避免语法报错
内容的提问来源于stack exchange,提问作者Alex100
相关产品推荐
相关产品推荐

