У меня есть корзина S3 с 500 000+ json
записей, например.
{
"userId": "00000000001",
"profile": {
"created": 1539469486,
"userId": "00000000001",
"primaryApplicant": {
"totalSavings": 65000,
"incomes": [
{ "amount": 5000, "incomeType": "SALARY", "frequency": "FORTNIGHTLY" },
{ "amount": 2000, "incomeType": "OTHER", "frequency": "MONTHLY" }
]
}
}
}
Я создал новую таблицу в Афине
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"
?
Должен ли янужно перебирать массив?
Как должен выглядеть результат?