#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 редукторов параллельно в конечной вершине редуктора. Но, если возможно, примените первый метод с рекурсивными irectories3. В чем может быть проблема leftjoin? Я убедился, что DDL-файлы точно такие же, и выполнил приведенный выше запрос. Он создает нулевые строки. : (
4. Как вы проверили, что данные не были загружены? Я полагаю, выберите count (*) из таблицы после загрузки?
5. ВЫБОР COUNT(*) ИЗ (ЗАПРОС UNION ALL ) в hive возвращает > 0 строк. Я проверил как в presto, так и в hive.