如何在Impala中将数组列查询为行?求可行替代方案
在Impala中实现类似Hive explode的数组拆分功能
我来帮你解决这个问题!首先得明确:Impala其实已经支持类似Hive explode的数组拆分能力,只是你之前的用法不对,而且不同版本的Impala有不同的实现方式,我给你分情况说明:
一、高版本Impala(2.3及以上):直接用explode + LATERAL VIEW
从Impala 2.3版本开始,官方已经支持explode函数搭配LATERAL VIEW来拆分数组,用法和Hive几乎一模一样。
1. 先确认你的Impala版本
先执行这条命令检查版本:
SELECT version();
如果版本≥2.3,直接用下面的方法就行。
2. 正确的拆分查询语句
针对你创建的tb表,想要拆分数组arr_col,应该这么写:
SELECT exploded_item FROM tb LATERAL VIEW explode(arr_col) exploded_table AS exploded_item;
执行后,你的数组['A','B']会被拆分成两行结果:A和B,完美实现Hive explode的效果。
二、低版本Impala(低于2.3):用数组下标遍历模拟
如果你的Impala版本比较旧,不支持explode,可以用数组下标+UNION ALL的方式临时替代,不过这种方法需要预估数组的最大长度:
比如假设你的数组最多有2个元素,写法如下:
SELECT arr_col[0] AS item FROM tb WHERE arr_col[0] IS NOT NULL UNION ALL SELECT arr_col[1] AS item FROM tb WHERE arr_col[1] IS NOT NULL;
如果数组长度不确定,这种方法会比较繁琐,但可以作为应急方案。
为什么你之前的查询会报错?
- 第一个报错:
select tb.arr_col from tb是因为Impala不允许直接在SELECT列表中返回复杂类型(比如数组、结构体),必须拆成标量类型才能返回。 - 第二个报错:
select tb.arr_col.item from tb是因为Impala根本没有这种访问数组元素的语法,正确的单个元素访问方式是arr_col[index](下标从0开始),但这只能取单个元素,没法拆分整个数组。
内容的提问来源于stack exchange,提问作者HP.
相关产品推荐
相关产品推荐

