gpt4 book ai didi

hadoop - 使用谓词下推在 Hive 中动态加载分区

转载 作者:可可西里 更新时间:2023-11-01 14:15:34 26 4
gpt4 key购买 nike

我在 Hive 中有一个非常大的表,我们需要从中加载分区的子集。它看起来像这样:

CREATE EXTERNAL TABLE table1 (
col1 STRING
) PARTITIONED BY (p_key STRING);

我可以像这样加载特定的分区:

SELECT * FROM table1 WHERE p_key = 'x';

p_keytable1 分区的键。如果我直接在 WHERE 子句中硬编码,一切都很好。但是,我有另一个查询可以计算我需要哪些分区。它比这更复杂,但让我们简单地定义它:

SELECT DISTINCT p_key FROM table2;

所以现在我应该能够像这样构造一个脏查询:

SELECT * FROM table1
WHERE p_key IN (SELECT DISTINCT p_key FROM table2);

或者写成内连接:

SELECT t1.* FROM table1 t1
JOIN (SELECT DISTINCT p_key FROM table2) t2 ON t1.p_key = t2.p_key

但是,当我运行它时,它需要足够的时间让我相信它正在执行全表扫描。在上述查询的解释中,我还可以看到 DISTINCT 操作的结果用于 reducer,而不是 mapper,这意味着 mapper 不可能知道应该加载或不加载哪些分区。诚然,我并不完全熟悉 Hive 解释输出,所以我可能忽略了一些东西。

我找到了这个页面:MapJoin and Partition Pruning在 Hive wiki 和相应的 ticket表示它是在版本 0.11.0 中发布的。所以我应该拥有它。

这有可能吗?如果是,怎么办?

最佳答案

我不确定如何帮助 MapJoin,但在最坏的情况下,您可以动态创建第二个查询,例如:

SELECT concat('SELECT * FROM table1 WHERE p_key IN (',
concat_ws(',',collect_set(p_key)),
')')
FROM table2;

然后执行得到的结果。有了这个,查询处理器应该能够修剪不需要的分区。

关于hadoop - 使用谓词下推在 Hive 中动态加载分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38720203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com