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