【问题标题】:Load and SQL Query DynamoDB Map data type in Athena在 Athena 中加载和 SQL 查询 DynamoDB Map 数据类型
【发布时间】:2021-04-06 07:26:43
【问题描述】:

我在 DynamoDB 中有这个项目,它包含一个 Map 属性:

{
  "orgName": {
    "S": "example"
  },
  "typeSavings": {
    "M": {
      "TELECOMS": {
        "N": "50"
      },
      "GAS": {
        "N": "393"
    }
  }
}

我已使用 DynamoDB 导出功能将此 DynamoDB 数据导出到 S3。

我可以像这样创建一个 Athena 表:

CREATE EXTERNAL TABLE IF NOT EXISTS mytable (
  Item struct <
  orgName:struct<S:string>,
  typeSavings:MAP<string,string>
  >
)
...

我可以像这样选择表格中的项目:

SELECT
    Item.orgname,
    Item.typeSavings
FROM mytable

结果在哪里:

orgname               typeSavings 
-------               --------------------
{s=Aaron's Pets Ltd}  {m={"telecoms":{"n":"50"},"gas":{"n":"393"}}}

如何选择gas typeSavings 大于 50 的项目?

我可以简单地访问 orgName(例如 WHERE Item.orgname.s = 'example'),但我不确定如何访问地图数据。

我会对在 SQL 查询步骤或将数据加载到 Athena 的步骤中解决此问题的解决方案感兴趣。例如,我很乐意将 TELECOMS 节省和 GAS 节省加载到不同的列中,此时 SQL 查询很简单。

【问题讨论】:

    标签: sql amazon-dynamodb amazon-athena


    【解决方案1】:

    我使用element_at 访问地图,然后使用json_extract 访问json 值。

    SELECT Item.orgname.S as name,
    CAST(json_extract(element_at(Item.typeSavings,'m'),'$.gas.n') AS DOUBLE) AS gassavings
    FROM mytable
    WHERE gassavings > 50
    

    【讨论】:

      猜你喜欢
      • 2020-02-02
      • 1970-01-01
      • 2018-07-25
      • 2021-10-18
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2020-01-30
      相关资源
      最近更新 更多