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 解析和编辑数组到结构字段的主要内容,如果未能解决你的问题,请参考以下文章

Hive解析Json数组超全讲解

Hive解析Json数组超全讲解

Hive -解析json(get_json_object)

解析Hive复杂字段1--lateral view explode

hive的HⅣE结构解析

hive 存储,解析,处理json数据