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

Posted

技术标签:

【中文标题】Hive 检查数组中的元素并获取索引【英文标题】:Hive check elements in array and get index 【发布时间】:2020-07-29 21:23:20 【问题描述】:

我有一个蜂巢表(学生),它有两列是数组。

student_list                array<string>                               
present_list                array<string> 

我知道有一个 hive 函数 array_contains(Array&lt;T&gt;, value) 来检查该项目是否存在于数组中,但我想知道该项目存在于多个项目中的索引。

student_list 的示例数据是一些学生 ID,例如

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

如果 present_list 是

["1LPT5Q4IE5XC","29V3SAK2Q79Z"]

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

【问题讨论】:

【参考方案1】:

一种选择是使用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 函数收集索引位置。

这种方法的一个缺点是在进行poseexplode时数据的交叉连接。使用横向视图会从每个数组项中生成行。如果处理量很大,这可能是一项昂贵的操作。

【讨论】:

以上是关于Hive 检查数组中的元素并获取索引的主要内容,如果未能解决你的问题,请参考以下文章

如何获取数组中的所有元素,而不是 HIVE 中的另一个数组中的所有元素?

php数组操作之获取数组元素索引(键)值

SwiftUI ForEach 获取二维数组中的元素和索引

比 O(n) 更快地获取数组元素的索引

忽略数组中的元素值时获取最小索引

获取某个数组元素 在 数组中的索引