如何在Hive中将大型数组拆分为多列(不使用数组索引)
HiveQL实现大数组拆分多列(无需手动写索引)
针对数组含16000个元素的场景,可用以下两种方法实现:
方法一:posexplode + 动态透视
1. 拆分数组为行记录
先把数组的每个元素和对应位置拆成行:
SELECT ID, pos + 1 AS col_num, value AS col_value FROM tmp_table LATERAL VIEW posexplode(Data) exploded AS pos, value;
这里pos+1是将位置从0转为1起始,对应目标列的Data_1到Data_16000。
2. 生成透视查询SQL
由于Hive不支持自动动态列,需要生成包含所有Data_n的CASE语句。可以用shell脚本快速生成这部分代码:
for i in {1..16000}; do echo "MAX(CASE WHEN col_num=$i THEN col_value END) AS Data_$i," done | head -n -1
将脚本输出的内容插入到下面的SQL中,执行透视:
SELECT ID, -- 这里插入脚本生成的所有CASE行 FROM ( SELECT ID, pos + 1 AS col_num, value AS col_value FROM tmp_table LATERAL VIEW posexplode(Data) exploded AS pos, value ) t GROUP BY ID;
方法二:posexplode + str_to_map
如果数组元素可转为字符串,可先将元素转为键值对映射,再提取列:
SELECT ID, -- 同样用脚本生成map_data['1'] AS Data_1,... 行 FROM ( SELECT ID, str_to_map(concat_ws(',', collect_list(concat(pos+1, ':', value)))) AS map_data FROM tmp_table LATERAL VIEW posexplode(Data) exploded AS pos, value GROUP BY ID ) t;
脚本生成列的方式和方法一类似,只需把CASE语句替换为map_data['$i'] AS Data_$i,即可。
内容的提问来源于stack exchange,提问作者Omer Farooq Ahmed
相关产品推荐
相关产品推荐

