如何为Hive中复杂array<struct<...>>类型编写注释并向复杂表插入数据?
刚好处理过类似的Hive复杂类型场景,给你两个问题的具体解决方案:
问题1:为Hive复杂
array<struct<...>>类型添加注释 Hive支持给嵌套的复杂类型逐层添加注释,主要有两种场景:
创建表时直接添加注释
在CREATE TABLE语句里,给每个层级的字段都加上COMMENT关键字即可,嵌套的struct字段要对应好层级:
CREATE TABLE IF NOT EXISTS test.test_complex_alter( `id` STRING COMMENT '唯一标识ID', `items` array<struct< quantity: INT COMMENT '商品数量', articleData:struct<subsysNumber:string COMMENT '子系统编号'> COMMENT '商品详情结构', pickedReason:string COMMENT '拣选原因' >> COMMENT '商品条目集合' ) STORED AS ORC;
已有表修改注释
如果表已经创建完成,可以用ALTER TABLE语句修改字段注释,注意要完整写出复杂类型的结构:
ALTER TABLE test.test_complex_alter CHANGE COLUMN items items array<struct< quantity: INT COMMENT '商品数量', articleData:struct<subsysNumber:string COMMENT '子系统编号'> COMMENT '商品详情结构', pickedReason:string COMMENT '拣选原因' >> COMMENT '商品条目集合';
问题2:向该复杂表插入数据
插入复杂类型数据时,需要用Hive的内置函数来构造array和struct,推荐用named_struct(可以指定字段名,避免顺序错误)和array函数:
用INSERT INTO VALUES插入单条/多条数据
直接构造复杂类型的值插入,示例如下:
INSERT INTO test.test_complex_alter(id, items) VALUES -- 单条商品条目 ('001', array(named_struct('quantity', 5, 'articleData', named_struct('subsysNumber', 'SYS001'), 'pickedReason', '正常拣选'))), -- 多条商品条目 ('002', array( named_struct('quantity', 2, 'articleData', named_struct('subsysNumber', 'SYS002'), 'pickedReason', '补货'), named_struct('quantity', 3, 'articleData', named_struct('subsysNumber', 'SYS003'), 'pickedReason', '加急订单') ));
从其他表插入数据
如果数据来自其他表,可以在SELECT语句中构造复杂类型:
INSERT INTO test.test_complex_alter(id, items) SELECT source_id AS id, array(named_struct( 'quantity', source_quantity, 'articleData', named_struct('subsysNumber', source_subsys_num), 'pickedReason', source_pick_reason )) AS items FROM test.source_table;
注意:如果使用普通的
struct()函数,必须严格按照表定义的字段顺序来构造,而named_struct()通过指定字段名来匹配,容错性更高,推荐使用。
内容的提问来源于stack exchange,提问作者Rumesh Krishnan
相关产品推荐
相关产品推荐

