#amazon-s3 #hadoop #hive #amazon-emr
#amazon-s3 #hadoop #улей #amazon-emr
Вопрос:
У меня настроено задание Amazon ElasticMapreduce для запуска запроса hive
CREATE EXTERNAL TABLE output_dailies (
day string, type string, subType string, product string, productDetails string,
uniqueUsers int, totalUsers int
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY 't'
LINES TERMINATED BY 'n'
STORED AS TEXTFILE
LOCATION '${OUTPUT}';
INSERT OVERWRITE TABLE output_dailies
select day, type, subType, product, productDetails, count(distinct accountId) as uniqueUsers, count(accountId) as totalUsers from raw_logs where day = '${QUERY_DATE}' group by day, type, subType, product, productDetails;
После завершения задания местоположение вывода, настроенное на S3, будет содержать 5 файлов с этим шаблоном task_201110280815_0001_r_00000x
, где x изменяется от 0 до 4. Файлы небольшие, по 35 КБ каждый.
Можно ли указать hive сохранять результаты в одном файле?
Ответ №1:
В общем, да, это достижимо, но с потерей некоторой масштабируемости
Попробуйте использовать параметр
«set mapred.reduce.tasks = 1;»
Это приводит к 1 редуктору, и поэтому будет выведен только 1 файл.
Ответ №2:
Они создаются разными узлами данных. Каждый из них добавляется к файлу — если бы все они должны были добавляться к одному и тому же файлу, это потребовало бы много блокировок и замедлило бы его.
Вы можете обрабатывать несколько файлов как один большой файл, просто ссылаясь на каталог и все его содержимое.
Комментарии:
1. Спасибо, Алекс. Кажется, для моих целей я могу просто объединить содержимое в один файл.
2. я пытаюсь найти одну наименьшую дату и одну наибольшую дату из моих журналов данных за более чем 2 месяца. EMR передает минимальные и максимальные даты из каждого из разных узлов данных в 5 разных выходных файлов. В результате я получаю 5 минимальных дат и 5 максимальных дат в 5 разных выходных файлах. Это не служит моей цели? Как мне объединить их все в один выходной файл, чтобы найти ОДНУ минимальную дату и ОДНУ максимальную дату по всему набору данных?