在 Athena 中加载和 SQL 查询 DynamoDB 地图数据类型
Load and SQL Query DynamoDB Map data type in Athena
我在 DynamoDB 中有这个项目,它包含一个 Map 属性:
{
"orgName": {
"S": "example"
},
"typeSavings": {
"M": {
"TELECOMS": {
"N": "50"
},
"GAS": {
"N": "393"
}
}
}
我已经使用 DynamoDB 导出功能将此 DynamoDB 数据导出到 S3。
我可以像这样创建一个 table 雅典娜:
CREATE EXTERNAL TABLE IF NOT EXISTS mytable (
Item struct <
orgName:struct<S:string>,
typeSavings:MAP<string,string>
>
)
...
我可以这样 select table 中的项目:
SELECT
Item.orgname,
Item.typeSavings
FROM mytable
结果是:
orgname typeSavings
------- --------------------
{s=Aaron's Pets Ltd} {m={"telecoms":{"n":"50"},"gas":{"n":"393"}}}
我如何 select gas
typeSavings 大于 50 的项目?
我可以简单地访问 orgName(例如 WHERE Item.orgname.s = 'example'
),但我不确定如何访问地图数据。
我会对在 SQL 查询步骤或将数据加载到 Athena 的步骤解决的解决方案感兴趣。例如,我很乐意将 TELECOMS 储蓄和 GAS 储蓄加载到不同的列中,此时 SQL 查询很简单。
我使用 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
我在 DynamoDB 中有这个项目,它包含一个 Map 属性:
{
"orgName": {
"S": "example"
},
"typeSavings": {
"M": {
"TELECOMS": {
"N": "50"
},
"GAS": {
"N": "393"
}
}
}
我已经使用 DynamoDB 导出功能将此 DynamoDB 数据导出到 S3。
我可以像这样创建一个 table 雅典娜:
CREATE EXTERNAL TABLE IF NOT EXISTS mytable (
Item struct <
orgName:struct<S:string>,
typeSavings:MAP<string,string>
>
)
...
我可以这样 select table 中的项目:
SELECT
Item.orgname,
Item.typeSavings
FROM mytable
结果是:
orgname typeSavings
------- --------------------
{s=Aaron's Pets Ltd} {m={"telecoms":{"n":"50"},"gas":{"n":"393"}}}
我如何 select gas
typeSavings 大于 50 的项目?
我可以简单地访问 orgName(例如 WHERE Item.orgname.s = 'example'
),但我不确定如何访问地图数据。
我会对在 SQL 查询步骤或将数据加载到 Athena 的步骤解决的解决方案感兴趣。例如,我很乐意将 TELECOMS 储蓄和 GAS 储蓄加载到不同的列中,此时 SQL 查询很简单。
我使用 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