hadoop - Hive 解析和编辑数组以构造字段

标签 hadoop hive mapreduce user-defined-functions hiveql

我有一个 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/

相关文章:

hadoop - 映射和 reduce task 计数在日志文件中不正确

hadoop - Apache kylin cube 失败 "no counters for job"

hadoop - 使用mapreduce处理文件

hadoop - 为什么 Hadoop yarn(2.7.1) 中的平均合并时间为零?以及如何获得这个时间的精确度

hadoop - Amazon Emr - 当我们拥有核心节点时,任务节点的需求是什么?

hadoop - 实时查找HBase表的行数(毫秒)

hadoop - 在 Hadoop 映射中处理 Zip 文件

hadoop - Bucketed Hive ORC 表的 sqoop 导入失败

import - 使用 sqoop 导入 Hive 时出现文件存在错误

java - 如何构建 buildOutputValue 方法