2017-01-17 2 views
0

У меня есть сценарий улей, который выглядит следующим образом:Обработка уведомлений S3 PUT при записи на ведро Amazon S3 с ульем внутри Amazon EMR

Пропустить заголовок в формате CSV при импорте

SET skip.header.line.count = 1; 

создать CAC таблицу

CREATE EXTERNAL TABLE channelAccessCodes (accessCode string,channelCode string,id string,upc string,version bigint) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES ("dynamodb.table.name" = "properties.channelAccessCode", 
"dynamodb.column.mapping" = "accessCode:accessCode,channelCode:channelCode,id:id,upc:upc,version:version"); 

CREATE TEMPORARY TABLE if not exists bdc (id STRING,name STRING,address STRING,zip STRING,city_hotel STRING,cc1 STRING,ufi STRING,class STRING,currencycode STRING,minrate STRING,maxrate STRING,preferred STRING,nr_rooms STRING,longitude STRING,latitude STRING,public_ranking STRING,hotel_url STRING,photo_url STRING,desc_en STRING,desc_fr STRING,desc_es STRING,desc_de STRING,desc_nl STRING,desc_it STRING,desc_pt STRING,desc_ja STRING,desc_zh STRING,desc_pl STRING,desc_ru STRING,desc_sv STRING,desc_ar STRING,desc_el STRING,desc_no STRING,city_unique STRING,city_preferred STRING,continent_id STRING,review_score STRING,review_nr STRING) 
ROW FORMAT DELIMITED fields terminated by '\t' lines terminated by '\n' 
stored as textfile 
LOCATION 's3://properties-uat-imports/input/BDC' 
tblproperties("skip.header.line.count"="1"); 

CREATE TEMPORARY TABLE TempTableDeletes(ChannelAccessCode STRING) 
ROW FORMAT DELIMITED fields terminated by '|' lines terminated by '\n'; 

INSERT INTO TABLE TempTableDeletes SELECT channelAccessCodes.id FROM channelAccessCodes LEFT JOIN bdc ON channelAccessCodes.id = CONCAT('BDC',bdc.id) WHERE CONCAT('BDC',bdc.id) IS NULL AND channelAccessCodes.id LIKE 'BDC%'; 

Раздел - Запись выбранных данных S3

create external table s3_export_deletes(ChannelAccessCode STRING) 
row format delimited lines terminated by '\n' 
stored as textfile 
LOCATION 's3://properties-uat-imports-emr/'; 

Записи

INSERT OVERWRITE TABLE s3_export_deletes SELECT * from TempTableDeletes; 

Это в основном считывает данные из таблицы динамо, и файл с S3 ... делает некоторый jiggery pokery в выходной таблицу и записывает эту таблицу на ведро S3.

Когда этот сценарий Hive работает на EMR, он записывает один файл в S3. У меня есть уведомление, настроенное на этом ведре, чтобы отправить сообщение в очередь SQS всякий раз, когда на ведро получено уведомление PUT. Я только ожидаю, что будет одно уведомление, но, кажется, несколько (6, если быть точным)?

Кто-нибудь знает, почему это так? И можно ли заставить Hive сделать только один звонок в ведро S3?

Спасибо,

Крис

+0

Я настоятельно рекомендую вам установить форматирование вокруг вашего кода. –

ответ

0

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

Я не могу думать ни о каком простого решения здесь не хватает фильтрации, что уведомления (лямбда?), Чтобы отбросить все, но окончательное обязательство PUT

Смежные вопросы