Amazon Redshift COPY с преобразованием

Redshift имеет операцию COPY, которая позволяет копировать файлы из S3 в Redshift (http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html).

Файлы .json, которые находятся в S3, являются «грязными»; они не готовы к прямому копированию в Redshift и должны сначала выполнить преобразование. Мой вопрос: нужно ли мне записывать новые очищенные файлы JSON обратно в S3 , затем выполните КОПИРОВАНИЕ из этих очищенных файлов, или есть способ запустить jsons через это преобразование как часть процедуры копирования?


person Tommy    schedule 06.11.2014    source источник


Ответы (1)


@Томми

Операция COPY допускает только несколько простых преобразований, таких как изменение формата DATETIME, заполнители NULL и т. Д.

Чтобы тщательно очистить ваши данные, вам, возможно, придется написать свою собственную программу и сбросить результаты обратно в S3, прежде чем их можно будет скопировать в красное смещение.

Если у вас мало данных, вы можете написать простую программу с использованием AWS SDK (доступного в вариантах Java, PHP и Python) для выполнения ETL и загрузки ее в красное смещение.

В нашем случае данные огромны (~ 400 миллионов строк в день), поэтому мы используем кодек Amazon EMR, HIVE и SerDe (JSON) для создания логических таблиц HIVE, применяем преобразования с помощью HQL и выгружаем очищенные результаты обратно в S3. как файлы с разделителями TAB. Затем мы загружаем результат в красное смещение, используя стандартную команду COPY. Мы также используем Amazon Data Pipeline для организации и автоматизации этого рабочего процесса.

Бывший. Сценарий HIVE

add jar s3://elasticmapreduce/samples/hive-ads/libs/jsonserde.jar; --SerDe codec

CREATE EXTERNAL TABLE  source_table_name (column_a string, column_b date)  row format 
    serde 'com.amazon.elasticmapreduce.JsonSerde'
    with serdeproperties ( 
      'paths'='column_a, column_b'
   ) LOCATION   's3a://your-bucket-name/source-directory-path/';

CREATE EXTERNAL TABLE  dest_table_name (column_a string, column_b date) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'  LOCATION 's3n://your-bucket-name/dest-directory-path/';

INSERT INTO dest_table_name select * from source_table_name;

Конечно, приведенный выше пример просто переформатирует данные. Возможно, вам придется добавить дополнительные преобразования в зависимости от вашего варианта использования.

Надеюсь это поможет.

person Jay    schedule 08.11.2014