Преобразование данных в AWS S3 в другую структуру схемы (также в S3) - PullRequest
0 голосов
/ 30 мая 2018

вопрос новичка -

У меня есть данные журнала, хранящиеся в файлах S3, в сжатом формате JSON.Файлы находятся в иерархии каталогов, которая отражает разбиение, следующим образом: s3://bucket_name/year=2018/month=201805/day=201805/some_more_partitions/file.json.gz

Недавно я изменил схему ведения журнала на немного другую структуру каталогов.Я добавил еще несколько уровней разделов, поля в настоящее время находятся внутри JSON, и я хочу переместить их в иерархию папок.Также я немного изменил внутреннюю схему JSON.Они находятся в другом сегменте S3.

Я хочу преобразовать старые журналы в новый формат, потому что у меня есть отображение Athena поверх новой структуры схемы.

Является ли AWS EMR инструментом для этого??Если да, то как проще всего этого добиться?Я думал, что мне нужен кластер EMR типа step execution, но он, вероятно, создает только один выходной файл, нет?

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Да. Для такого преобразования можно использовать EMR.

Вот пример кода для преобразования данных, поступающих в формате csv (папка stg или исходная папка) в формат файла orc.Возможно, вы захотите выполнить перезапись вставки, если у вас есть перекрывающиеся разделы между вашими промежуточными файлами (или исходными файлами) и целевыми файлами

DROP TABLE IF EXISTS db_stg.stg_table;

CREATE EXTERNAL TABLE `db_stg.stg_table`(
GEO_KEY string,
WK_BEG_DT string,
FIS_WK_NUM Double,
AMOUNT1 Double
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION
  's3://bucket.name/stg_folder_name/'
TBLPROPERTIES ('has_encrypted_data'='false');


drop  table  db_tgt.target_table;

CREATE EXTERNAL TABLE db_tgt.target_table(
GEO_KEY string,
FIS_WK_NUM Double,
AMOUNT1 Double
)
PARTITIONED BY(FIS_WK_NUM)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

location 's3://bucket.name/tgt_folder_name/'

TBLPROPERTIES (
  'orc.compress'='SNAPPY');

set hive.exec.dynamic.partition.mode=nonstrict;


insert overwrite  table  db_tgt.target_table partition(FIS_WK_NUM)
  select
GEO_KEY  ,
WK_BEG_DT ,
FIS_WK_NUM  ,
AMOUNT1   
from  db_stg.stg_table;

Согласитесь с Джоном, что преобразование в формат столбчатых файлов, таких как Parquet или ORC (вместес компрессией, подобной SNAPPY), даст вам лучшую производительность с AWS Athena.

Помните, что ключом к использованию Athena является оптимизация объема данных, которые вы сканируете при чтении.Следовательно, если данные представлены в столбчатом формате и вы читаете определенные разделы, стоимость AWS Athena значительно снизится.Все, что вам нужно сделать, это убедиться, что вы используете условие фильтра в запросах Athena, которое выбирает требуемые разделы.

0 голосов
/ 30 мая 2018

Да, Amazon EMR - подходящий инструмент для использования.

Вы можете использовать Hive, синтаксис которого похож на Athina:

  • СоздатьВнешняя таблица, указывающая на ваши существующие данные, используя вашу старую схему
  • Создайте Внешнюю таблицу, указывающую, где вы хотите сохранить данные, используя вашу новую схему
  • INSERT INTO new-table SELECT * FROM old-table

Если вы собираетесь запрашивать данные с помощью Amazon Athena, вы можете использовать Amazon EMR для преобразования данных в формат Parquet , что обеспечит еще большую производительность запросов.

См .: Анализ данных в S3 с помощью Amazon Athena |Блог больших данных AWS

...