2014-11-06 149 views
0

Redshift有一個COPY操作,允許您將文件從S3複製到Redshift(http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html)。Amazon Redshift COPY與轉換

在S3中的.json文件是「髒」的;它們沒有準備好直接複製到Redshift中,需要首先通過轉換運行。我的問題是:是否需要編寫新的清理過的JSON文件傳回S3,然後從這些清除的文件進行復制,或者是有一種方式來運行經歷這種轉變的jsons作爲複製過程的一部分?

回答

6

@tommy

複製操作只允許幾個簡單像DATETIME格式更改,NULL佔位符等轉換。

要廣泛地清理您的d ata,你可能需要編寫自己的程序並將結果轉儲回S3,然後才能將其複製到紅移中。

如果您的數據很小,您可以使用AWS SDK(可用Java,PHP和Python版本)編寫一個簡單的程序來執行ETL並將其加載到redshift中。我們使用Amazon EMR,HIVE和SerDe(JSON)編解碼器來創建邏輯HIVE表,使用HQL應用轉換,並轉儲清理後的數據返回到S3作爲TAB分隔文件。然後,我們使用標準的COPY命令將結果加載到紅移中。我們還使用Amazon Data Pipeline來編排和自動化此工作流程。

Ex。 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; 

當然,上面顯示的示例只是重新格式化數據。您可能需要根據您的用例添加額外的轉換。

希望這會有所幫助。