arrays - Hive 检查数组中的元素并获取索引
问题描述
我有一个蜂巢表(学生),它有两列是数组。
student_list array<string>
present_list array<string>
我知道有一个 hive 函数array_contains(Array<T>, value)
来检查该项目是否存在于数组中,但我想知道的是该项目存在于多个项目中的索引。
student_list 的示例数据是一些学生 ID,例如
["1LPT5Q4IE5XC","1SU2QNCG98BC","29V3SAK2Q79Z"]
如果 present_list 是
["1LPT5Q4IE5XC","29V3SAK2Q79Z"]
我想要该[0,2]
行的输出。
解决方案
一种选择是使用poseexplode来生成列表的位置和值。如下所示:
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]
。这个想法是生成一个位置列表,然后在列表中的两个值之间进行简单匹配。collect_set
使用hive中的函数收集索引位置。
这种方法的缺点之一是在进行poseexplode时数据的交叉连接。使用横向视图会从每个数组项中生成行。在大容量的情况下,这可能是一项昂贵的操作。
推荐阅读
- java - 迭代并调用方法列表
- python - python web 抓取选项卡窗格
- crystal-reports - 删除/删除水晶报表中同一列和行中的特定文本
- spring-boot - 如何在spring boot中打印2个不同文件中2个类的日志
- java - JavaPOS如何让两台电脑接连连接到同一台打印机?
- scala - Spark UDF - 返回类型 DataFrame
- python - 如何在python中复制文件对象
- c# - 使用 LINQ 有效地验证累积和验证属性
- curl - 如何通过 SSH 主机发送请求
- sharepoint - SharePoint 列表无法取消隐藏隐藏列