将 Amazon Athena 与 DynamoDB 备份集成

Integrating Amazon Athena with DynamoDB backups

我有备份到 S3 中的 DynamoDB 表,需要一种(相当少的)方法以 Dynamo 不支持的方式对我们的数据进行定制查询。 Athena 似乎是使用我们的 S3 备份作为原型 DW/BI 工具来源的好方法。

问题是 DyanmoDB 备份到 S3 以这种格式存储每一行​​

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

这让 Athena / Presto 难以阅读。我可以使用

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

但这并不理想,因为 'number' 仍被视为字符串。我考虑过下载文件,将 JSON 展平并重新上传到其他地方,但这也无效 JSON。只有文件的每一行有效 JSON.

Athena 是否有办法读取文件中的数据,以便正确导入字段类型?或者理想情况下,Athena 是否可以将 {"n":"1234"} 扁平化为 int?

我不认为这是最理想的答案,但这是我找到的答案。

Presto 允许您提取 json 以及转换值。因此,您可以创建 table 并将列转换为正确的格式,而不是在从 Athena 读取之前改变数据的存储方式:

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或者column.n

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

您可以在这里阅读更多相关信息:https://prestodb.io/docs/current/functions/json.html