目前我的查询存在性能问题:
select userid from table_x inner join table_y on array_contains(split(table_y.userids,','),cast(table_x.userid as string))
y上的用户ID表示为一串数字“123,134,156”,实际上表示三个用户ID,即123,134和156.Table_x有一个userid列,详细说明了每个用户的个人信息。我想选择table_y中userids列中包含的userid。
我是否正确地假设perforamance问题的原因是因为我必须使用split(table_y.userids,',')将table_y中的userid转换为字符串数组,并使用array_contains作为字符串。如果是这样,是否有人知道如何将userid字符串转换为整数数组?
谢谢!
答案 0 :(得分:1)
您似乎正在进行笛卡尔积加入。 Hive无法加入array_contains
- 它会在hive生成所有可能的组合后应用。
要真正加入,您需要使用explode(split(table_y.userids,','))
,然后进行常规的等式连接:
select x.uid from (select cast(table_x.userid as string) as uid from table_x) x
inner join
(select explode(split(table_y.userids,',')) as uid from table_y) y on
x.uid=y.uid;