Hive 解析和编辑数组到结构字段
Posted
技术标签:
【中文标题】Hive 解析和编辑数组到结构字段【英文标题】:Hive parse and edit array to struct field 【发布时间】:2018-06-22 12:59:35 【问题描述】:我对 Hive 复杂数据结构有一个要求,我是新手。我尝试了一些没有成功的事情。我想知道是否有解决方案,或者我正在寻找死胡同。 要求 : 表 1 和表 2 具有相同的创建语法。我想从 table1 中选择所有列并将其插入到 table2 中,其中将修改很少的列值。对于 struct 字段,我也可以使用 named_struct 使其工作。 但是如果 table1 有 array> 类型,那么我不确定如何使它工作。
例如,
CREATE TABLE IF NOT EXISTS table1 (
ID INT,
XYZ array<STRUCT<X:DOUBLE, Y:DOUBLE, Z:DOUBLE>>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '$'
MAP KEYS TERMINATED BY '#' ;
CREATE TABLE IF NOT EXISTS table2 (
ID INT,
XYZ array<STRUCT<X:DOUBLE, Y:DOUBLE, Z:DOUBLE>>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '$'
MAP KEYS TERMINATED BY '#' ;
hive> select * from table1 ;
OK
1 ["x":1,"y":2,"z":3,"x":4,"y":5,"z":6,"x":7,"y":8,"z":9]
2 ["x":4,"y":5,"z":6,"x":7,"y":8,"z":9]
如何在插入时更新数组中的结构字段。假设如果 structField y 为 5,那么我希望它插入为 0。
【问题讨论】:
【参考方案1】:对于复杂类型的结构,您可以使用Brickhouse UDF。下载 jar 并将其添加到您的脚本中。
add jar hdfs://path_where_jars_are_downloaded/brickhouse-0.6.0.jar
创建一个收集函数。
create temporary function collect_arrayofstructs as 'brickhouse.udf.collect.CollectUDAF';
查询:将y值替换为0
select ID, collect_arrayofstructs(
named_struct(
"x", x,
"y", 0,
"z", z,
)) as XYZ
from table1;
【讨论】:
感谢您的及时回复。但是您建议的是UDAF。我不想进行分组。我只想传递一个数组并获取和更新数组作为输出。以上是关于Hive 解析和编辑数组到结构字段的主要内容,如果未能解决你的问题,请参考以下文章