sql - 如何在 Athena (Presto) 中查询和迭代结构数组?
问题描述
我有一个包含 500,000 多条记录的 S3 存储桶json
,例如。
{
"userId": "00000000001",
"profile": {
"created": 1539469486,
"userId": "00000000001",
"primaryApplicant": {
"totalSavings": 65000,
"incomes": [
{ "amount": 5000, "incomeType": "SALARY", "frequency": "FORTNIGHTLY" },
{ "amount": 2000, "incomeType": "OTHER", "frequency": "MONTHLY" }
]
}
}
}
我在 Athena 中创建了一个新表
CREATE EXTERNAL TABLE profiles (
userId string,
profile struct<
created:int,
userId:string,
primaryApplicant:struct<
totalSavings:int,
incomes:array<struct<amount:int,incomeType:string,frequency:string>>,
>
>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://profile-data'
我对incomeTypes
例如感兴趣。"SALARY"
, "PENSIONS"
, "OTHER"
, 等等.. 并且jsonData.incometype
每次运行这个查询都会改变:
SELECT jsonData
FROM "sampledb"."profiles"
CROSS JOIN UNNEST(sampledb.profiles.profile.primaryApplicant.incomes) AS la(jsonData)
WHERE jsonData.incometype='SALARY'
这很好用CROSS JOIN UNNEST
,它使收入数组变平,以便上面的数据示例跨越 2 行。唯一特殊的事情是CROSS JOIN UNNEST
使所有字段名称都小写,例如。一行看起来像这样:
{amount=1520, incometype=SALARY, frequency=FORTNIGHTLY}
现在有人问我有多少用户有两个或更多"SALARY"
条目,例如。
"incomes": [
{ "amount": 3000, "incomeType": "SALARY", "frequency": "FORTNIGHTLY" },
{ "amount": 4000, "incomeType": "SALARY", "frequency": "MONTHLY" }
],
我不知道该怎么做。
如何查询结构数组以查找重复
incomeTypes
的"SALARY"
?我必须遍历数组吗?
结果应该是什么样子?
解决方案
UNNEST
是一个非常强大的功能,使用它可以解决这个问题。但是,我认为使用Presto 的 Lambda 函数更直接:
SELECT COUNT(*)
FROM sampledb.profiles
WHERE CARDINALITY(FILTER(profile.primaryApplicant.incomes, income -> income.incomeType = 'SALARY')) > 1
此解决方案FILTER
在profile.primaryApplicant.incomes
数组上使用仅获取具有incomeType
of 的那些SALARY
,然后CARDINALITY
提取该结果的长度。
区分大小写对 SQL 引擎来说绝非易事。总的来说,我认为你不应该期望他们尊重案例,很多人不这样做。Athena 尤其将列名显式转换为小写。
推荐阅读
- node.js - 在 lambda 中减少对 AWS Secrets Manager 的请求
- linux - X11和Wayland的性能测量
- swift - 更新到 Xcode 12 后,“Messaging”类型的值没有成员“shouldEstablishDirectChannel”
- python - 从预订中返回最受欢迎的设施?
- android - GPS跟踪的前台服务在一段时间后停止工作
- vue.js - Vuetify 数据表 v-model 对表项内部的更改没有反应
- jsp - jboss/wildfly - 在 Web 容器外提供 xml 文件
- linux - 在 Linux-5.11.4 中跟踪 softirq_raise 的跟踪点失败
- mysql - 在 SSIS 中从 MySQL 到 SQL 的数据转换
- ios - UIView 转换为 UIImage 时如何使用自动布局