我正在尝试从数组中筛选值。应保留哪些值的信息位于另一个表中。
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行。我想交叉连接是瓶颈,因为它只使用一个减速机。
有没有办法优化这个查询?
谢谢!
1条答案
按热度按时间uqdfh47h1#
我有一个不同的假设。
需要减速器才能产生
filter_keywords
,不是为了CROSS JOIN
这是一个Map操作。所以这里没问题。
我的猜测是,性能惩罚来自于使用
array_intersect
如果有1000个元素的数组,那么解决方法就是避开它。附笔
没有必要这样做
grouping_dummy
.你不需要使用
GROUP BY
为了使用聚合函数。