我有一个 Hive 复杂数据结构的要求,我是新手。我尝试了一些没有成功的事情。我想知道是否有解决方案,或者我正在寻找死胡同。 要求 : Table1 和 Table2 具有相同的创建语法。我想从 table1 中选择所有列并将其插入到 table2 中,其中将修改很少的列值。对于结构字段,我可以使用 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 插入。
最佳答案
对于复杂类型结构,您可以使用 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;
关于hadoop - Hive 解析和编辑数组以构造字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50988497/