根据其他表筛选数组

whhtz7ly  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(213)

我正在尝试从数组中筛选值。应保留哪些值的信息位于另一个表中。

table_a                        table_b
___________________            ___________
| id | values     |            | keyword |
-------------------            -----------
| 1  | [a, b, c]  |            |    b    |
| 2  | [d, e, f]  |            |    e    |
| 3  | [a, g]     |            |    f    |
-------------------            -----------

我期望得到以下结果:

output
________________________
| id | filtered_values | 
------------------------
| 1  | [b]             | 
| 2  | [e, f]          |
| 3  | []              |
------------------------

目前,我正在使用以下查询:

SELECT
  id,
  array_intersect(ta.values, tb.filter_keywords) AS filtered_values -- brickhouse UDF
FROM
  table_a ta
CROSS JOIN (
  SELECT
    collect_set(keyword) as filter_keywords
  FROM (
    SELECT
      "dummy" as grouping_dummy,
      keyword
    FROM
      table_b
  ) tmp
  GROUP BY
    grouping_dummy
)

表a有几百万行,表b不到1000行。我想交叉连接是瓶颈,因为它只使用一个减速机。
有没有办法优化这个查询?
谢谢!

uqdfh47h

uqdfh47h1#

我有一个不同的假设。
需要减速器才能产生 filter_keywords ,不是为了 CROSS JOIN 这是一个Map操作。
所以这里没问题。
我的猜测是,性能惩罚来自于使用 array_intersect 如果有1000个元素的数组,那么解决方法就是避开它。
附笔
没有必要这样做 grouping_dummy .
你不需要使用 GROUP BY 为了使用聚合函数。

select      a.id
           ,collect_list (case when b.keyword is not null then a.val end)  as vals

from       (select  a.id
                   ,e.val

            from    table_a a

                        lateral view outer 

                            explode (a.vals) e as val
            ) a

            left join   table_b b

            on          b.keyword   =
                        a.val

group by    a.id
+----+-----------+
| id |   vals    |
+----+-----------+
|  1 | ["b"]     |
|  2 | ["e","f"] |
|  3 | []        |
+----+-----------+

相关问题