UNION ALL 不会在 Hive 中生成任何数据
Posted
技术标签:
【中文标题】UNION ALL 不会在 Hive 中生成任何数据【英文标题】:UNION ALL doesn't generate any data in Hive 【发布时间】:2019-03-05 06:50:50 【问题描述】:我正在尝试对具有相同 DDL 结构的三个不同表执行 UNION ALL,但最终输出生成零行。我不知道底层执行中发生了什么。有人可以分享您对此的想法吗?我的示例 Hive SQL 如下所示。谢谢。
SET hive.execution.engine=tez;
SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.qubole.cleanup.partial.data.on.failure=true;
SET hive.tez.container.size=8192;
SET tez.task.resource.memory.mb=8192;
SET tez.task.resource.cpu.vcores=2;
SET hive.mapred.mode=nonstrict;
SET hive.qubole.dynpart.use.prefix=true;
SET hive.vectorized.execution.enabled=true;
SET hive.vectorized.execution.reduce.enabled =true;
SET hive.cbo.enable=true;
SET hive.compute.query.using.stats=true;
SET hive.stats.fetch.column.stats=true;
SET hive.stats.fetch.partition.stats=true;
SET mapred.reduce.tasks = -1;
SET hive.auto.convert.join.noconditionaltask.size=2730;
SET hive.auto.convert.join=true;
SET hive.auto.convert.join.noconditionaltask=true;
SET hive.auto.convert.join.noconditionaltask.size=405306368;
SET hive.compute.query.using.stats=true;
SET hive.stats.fetch.column.stats=true;
SET hive.stats.fetch.partition.stats=true;
SET mapreduce.job.reduce.slowstart.completedmaps=0.8;
CREATE TABLE IF NOT EXISTS X STORED AS PARQUET AS
SELECT a,
b,
c
FROM A
UNION ALL
SELECT a,
b,
c
FROM B
UNION ALL
SELECT a,
b,
c
FROM C;
如果我尝试在 Presto 上运行以下查询,则显示有数据。
SELECT COUNT(1) FROM
(
SELECT a,
b,
c
FROM A
UNION ALL
SELECT a,
b,
c
FROM B
UNION ALL
SELECT a,
b,
c
FROM C
)Z;
【问题讨论】:
请检查您的桌子上是否有可用的数据。 【参考方案1】:UNION ALL
在 Tez 上运行时并行运行并在表位置创建额外的子目录(检查表位置内的内容)。尝试在读取表之前添加这些配置设置,以允许 Hive 读取子目录:
set hive.mapred.supports.subdirectories=true;
set mapred.input.dir.recursive=true;
您的查询非常简单并且在映射器上运行——只有每个子查询编写它自己的子目录并且不会干扰另一个子目录。
或者您可以通过在末尾添加distribute by
或order by
(运行速度较慢)来强制额外的减速器阶段,运行 UNION 而不是 UNION ALL,在联合之后应用过滤器等 - 它会在没有子目录的表文件夹中创建文件:
CREATE TABLE IF NOT EXISTS X STORED AS PARQUET AS
select * from
(
SELECT a,
b,
c
FROM A
UNION ALL
SELECT a,
b,
c
FROM B
UNION ALL
SELECT a,
b,
c
FROM C
)s distribute by a; --this will force reducer step
【讨论】:
我的底层文件存储在 S3 上。这会导致任何问题吗? @Teja 为了避免重新加载此表后 S3 中的最终一致性(删除后读取),请应用创建较少文件数的方法。通过低基数列或例如distribute by FLOOR(RAND()*100.0)%20
分发 - 它将创建 20 个相等的文件,并将在最终减速器顶点上并行运行 20 个减速器。但如果可能的话,使用递归目录应用第一种方法
leftjoin 可能是什么问题?我确保 DDL 完全相同并运行上述查询。它产生零行。 :(
您是如何检查数据未加载的?我想在加载后从表中选择计数(*)?
SELECT COUNT(*) FROM (UNION ALL QUERY) in hive 返回 > 0 行。我已经检查了 presto 和 hive。以上是关于UNION ALL 不会在 Hive 中生成任何数据的主要内容,如果未能解决你的问题,请参考以下文章