Hive多数组列行转列实现求助(需结合Lateral View示例)
解决Hive中同时拆分两个对应数组字段的问题
这个场景我太熟悉了!单独用explode确实没法实现两个数组元素的一一对应拆分,因为explode只能处理单个数组,没法关联另一个数组的位置。这时候我们可以结合posexplode(带位置的explode)和Lateral View来搞定,具体实现分两种情况:
情况1:col2和col3已经是数组类型
如果你的表中col2、col3本身就是array<int>和array<string>类型,直接用下面的查询语句:
SELECT t.col1, col2_val, col3_val FROM your_table t LATERAL VIEW posexplode(t.col2) col2_table AS col2_pos, col2_val LATERAL VIEW posexplode(t.col3) col3_table AS col3_pos, col3_val WHERE col2_pos = col3_pos;
逻辑说明:
posexplode会把数组拆成位置索引和对应元素两列,比如对(1,2,3)拆分后会得到(0,1),(1,2),(2,3)- 两个
Lateral View分别拆分col2和col3,然后通过WHERE col2_pos = col3_pos来保证同一位置的元素匹配,这样就能得到你要的一一对应结果。
情况2:col2和col3是字符串类型(比如原数据是(1,2,3)这种格式)
如果你的字段是字符串,得先把字符串转换成数组,再用上面的逻辑处理:
SELECT t.col1, col2_val, col3_val FROM your_table t LATERAL VIEW posexplode(split(regexp_replace(t.col2, '[()]', ''), ',')) col2_table AS col2_pos, col2_val LATERAL VIEW posexplode(split(regexp_replace(t.col3, '[()]', ''), ',')) col3_table AS col3_pos, col3_val WHERE col2_pos = col3_pos;
转换逻辑说明:
regexp_replace(t.col2, '[()]', ''):把字符串里的括号去掉,比如(1,2,3)变成1,2,3split(..., ','):把处理后的字符串按逗号分割成数组,这样就可以用posexplode拆分了。
测试效果
假设你的测试数据是:
col1 col2 col3 1 (1,2,3) (A,B,C)
执行上面的查询后,会得到:
col1 col2_val col3_val 1 1 A 1 2 B 1 3 C
完全符合你想要的输出格式!
内容的提问来源于stack exchange,提问作者saurabh kumar
相关产品推荐
相关产品推荐

