【发布时间】:2019-08-06 02:46:25
【问题描述】:
我有一个包含 500,000+ json 记录的 S3 存储桶,例如。
{
"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'
我对@987654324@ 感兴趣,例如。 "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"?我必须遍历数组吗?
结果应该是什么样子?
【问题讨论】:
标签: sql json amazon-athena presto