hive 检查数组中的元素并获取索引

x8diyxa7  于 2021-04-09  发布在  Hive
关注(0)|答案(1)|浏览(2666)

我有一个hive表(学生),其中有两列是数组。

student_list                array<string>                               
present_list                array<string>

我知道有一个函数array_contains(Array<T>, value)来检查这个项目是否存在于数组中,但是我想知道的是这个项目在多个项目中存在的索引。
例如 student_list 的数据是一些学生 id,如

["1LPT5Q4IE5XC","1SU2QNCG98BC","29V3SAK2Q79Z"]

如果 present_list 是

["1LPT5Q4IE5XC","29V3SAK2Q79Z"]

我希望该行的输出为[0,2]

bvn4nwqk

bvn4nwqk1#

有一个选择是使用posexplode来生成你的列表的位置和值,如下所示。

select collect_set(x.pos) as result
from(
 select sl.p1, sl.v1, pl.p2, pl.v2, (sl.v1 = pl.v2) as match
 from table_name
 lateral view posexplode(student_list) sl as p1,v1
 lateral view posexplode(present_list) pl as p2,v2
) as x where match=true

上面的结果是[0,2].我们的想法是生成一个位置列表,然后在列表中的两个值之间做简单的匹配。使用hive中的collect_set函数收集索引位置。
这种方法的一个缺点是在做posexplode时数据的交叉连接。使用横向视图从每个数组项目中生成行。

相关问题