UNION ALL не генерирует никаких данных в Hive - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь выполнить UNION ALL для трех разных таблиц с одинаковой структурой DDL, но в результате получается ноль строк.Я понятия не имею, что происходит в базовом исполнении.Кто-нибудь может поделиться своими мыслями по этому поводу?Мой пример 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 Ответ

0 голосов
/ 05 марта 2019

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
...