我正在尝试对具有相同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;
答案 0 :(得分:0)
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