2017-05-31 25 views
1

私はS3にバックアップされたDynamoDBテーブルを用意しており、Dynamoがサポートしていない方法でデータに対して注文付きクエリを実行する必要があります。 Athenaは、私たちのS3バックアップをproto DW/BIツールのソースとして使う良い方法のようです。Amazon AthenaとDynamoDBバックアップの統合

これで問題がアテナ/プレストがそれを読むためには、この形式のS3格納各行にDyanmoDBバックアップが

{"Column1":{"n":"1234"},"Column2":{"n":"5678"},"Column3":{"s":"abcd"}} 

これは、それが困難になるということです。

CREATE EXTERNAL TABLE test_table (
    column1 struct<n:string> 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 

これは理想的ではありません。数字は文字列と見なされます。私はファイルをダウンロードし、JSONを平坦化して別の場所にアップロードすることを検討しましたが、これは有効なJSONでもありません。ファイルの各行のみが有効なJSONです。

アテナがファイル内のデータを読み取ってフィールドタイプを正しくインポートする方法はありますか?または理想的には、Athenaが{"n": "1234"}をintにフラット化する方法がありますか?

答えて

1

私はこれが最も理想的な答えだとは確信していませんが、これは私が見つけたものです。

Prestoでは、json値とキャスト値の両方を抽出できます。だから、代わりにデータは、アテナから読む前に保存されているテーブルを作成することができますので、のような正しい形式に列をキャストする方法変更の:

CREATE EXTERNAL TABLE IF NOT EXISTS tableToCreate (
    userid struct<s:string> , 
    timestamp struct<n:bigint> , 
    reason struct<s:string> 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
LOCATION 's3://some-place 

、あなたが照会されている場合、column.s上のクエリまたは

SELECT userid.s timestamp.n FROM tableToCreate WHERE reason.s = 'REASON' 

column.nあなたがここでそれについての詳細を読むことができます:https://prestodb.io/docs/current/functions/json.html

関連する問題