ОБЪЕДИНЕНИЕ ВСЕХ не генерирует никаких данных в улье

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

Вопрос:

Я пытаюсь объединить ВСЕ для трех разных таблиц с одинаковой структурой 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;
 

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

В качестве альтернативы вы можете форсировать дополнительный этап редуктора, добавив distribute by в конце или order by (будет работать медленнее), запустить ОБЪЕДИНЕНИЕ вместо ОБЪЕДИНЕНИЯ ВСЕХ, применить фильтр после объединения и т. Д. — Это создаст файлы в папке таблицы без подкаталогов:

 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 редукторов параллельно в конечной вершине редуктора. Но если возможно, примените первый метод с рекурсивными каталогами

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

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

5. ВЫБЕРИТЕ КОЛИЧЕСТВО(*) ИЗ ( ОБЪЕДИНИТЬ ВСЕ ЗАПРОСЫ ) в hive возвращает > 0 строк. Я зарегистрировался как в presto, так и в hive.