UNION ALL не генерирует никаких данных в Hive

#sql #hadoop #hive #hiveql #hive-query

#sql #hadoop #hive #hiveql #hive-запрос

Вопрос:

Я пытаюсь ОБЪЕДИНИТЬ ВСЕ для трех разных таблиц с одинаковой структурой 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. Пожалуйста, проверьте, доступны ли данные в вашей таблице.

Ответ №1:

UNION ALL при запуске на Tez выполняется параллельно и создает дополнительные подкаталоги в расположении таблицы (проверьте, что находится внутри расположения таблицы). Попробуйте добавить эти параметры конфигурации перед чтением таблицы, чтобы разрешить Hive читать подкаталоги:

 set hive.mapred.supports.subdirectories=true; 
set mapred.input.dir.recursive=true;
  

Ваш запрос довольно прост и выполняется на mappers — только каждый подзапрос записывает свой собственный подкаталог и не мешает другому.

В качестве альтернативы вы можете запустить дополнительный этап редукции, добавив distribute by в конце or order by (будет работать медленнее), запустить UNION вместо UNION ALL, применить фильтр после union и т.д. — Это создаст файлы в папке таблицы без подкаталогов:

 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
  

Комментарии:

1. Мои базовые файлы хранятся на S3. Вызовет ли это какие-либо проблемы?

2. @Teja Чтобы избежать возможной согласованности в S3 (чтение после удаления) после повторной загрузки этой таблицы, примените метод, который создает меньшее количество файлов. распределите по столбцу с низкой мощностью или, например, distribute by FLOOR(RAND()*100.0) — это создаст 20 одинаковых файлов и запустит 20 редукторов параллельно в конечной вершине редуктора. Но, если возможно, примените первый метод с рекурсивными irectories

3. В чем может быть проблема leftjoin? Я убедился, что DDL-файлы точно такие же, и выполнил приведенный выше запрос. Он создает нулевые строки. : (

4. Как вы проверили, что данные не были загружены? Я полагаю, выберите count (*) из таблицы после загрузки?

5. ВЫБОР COUNT(*) ИЗ (ЗАПРОС UNION ALL ) в hive возвращает > 0 строк. Я проверил как в presto, так и в hive.