【问题标题】:Count ROW type item Athena / PrestoCount ROW 类型项目 Athena / Presto
【发布时间】:2021-12-28 15:02:45
【问题描述】:

我有一个这样的 Athena 查询

SELECT typeof(records)
FROM "default"."table"
WHERE date = '2021-07-24'
AND device_id = 'abc'

结果是

_col0
row(1579560177000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579518772000 row(ds decimal(38,9)), 1579529572000 row(ds decimal(38,9)), 1579554776000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579556575000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579517872000 row(ds decimal(38,9)), 1579547574000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579525072000 row(ds decimal(38,9)), 1579551176000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579555676000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579540372000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579564676000 row(ds decimal(38,9)), 1579548475000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579530472000 row(ds decimal(38,9)), 1579528672000 row(ds decimal(38,9)), 1579552076000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579516072000 row(ds decimal(38,9)), 1579519672000 row(ds decimal(38,9)), 1579520572000 row(ds decimal(38,9)), 1579561076000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579535872000 row(ds decimal(38,9)), 1579544873000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579557476000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579561976000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579546674000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579516972000 row(ds decimal(38,9)), 1579523272000 row(ds decimal(38,9)), 1579538572000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579525972000 row(ds decimal(38,9)), 1579542173000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579559276000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579521472000 row(ds decimal(38,9)), 1579522372000 row(ds decimal(38,9)), 1579533172000 row(ds decimal(38,9)), 1579537672000 row(ds decimal(38,9)), 1579526872000 row(ds decimal(38,9)), 1579562876000 row(ds decimal(38,9)), 1579545773000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579550275000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579558376000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579532272000 row(ds decimal(38,9)), 1579536772000 row(ds decimal(38,9)), 1579549375000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579552976000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579563776000 row(ds decimal(38,9)), 1579524172000 row(ds decimal(38,9)), 1579543973000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579553876000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579534972000 row(ds decimal(38,9)), 1579539472000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579541272000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579543073000 row(ab decimal(38,9), bc  decimal(38,9), cd decimal(38,9), de decimal(38,9), ef decimal(38,9), fg decimal(38,9), gh decimal(38,9), hi decimal(38,9), ij decimal(38,9), jk decimal(38,9)), 1579531372000 row(ds decimal(38,9)), 1579527772000 row(ds decimal(38,9)), 1579534072000 row(ds decimal(38,9)))

我想计算每台设备每天的记录数以获得这样的结果

device_id, date, recordsNb
abc, 2021-07-24, 37

编辑

我的数据集其实是这样的

device_id, date, records
abc, 2021-07-24, {"1": {}, "2":{}}
def, 2021-07-24, {"a": {}, "b":{}, "c": {}}

这里的预期结果是:

device_id, date, recordsNb
abc, 2021-07-24, 2
def, 2021-07-24, 3

【问题讨论】:

    标签: sql amazon-web-services amazon-athena presto


    【解决方案1】:

    您可以将您的 json 转换为映射并计算键的数量:

    WITH dataset(device_id, date, records) AS (
        values 
            ('abc', date '2021-07-24', JSON '{"1": {}, "2":{}}'),
            ('def', date '2021-07-24', JSON '{"a": {}, "b":{}, "c": {}}')
    )
    
    SELECT device_id,
        date,
        cardinality(map_keys(cast(records as MAP(VARCHAR, JSON)))) recordsNb
    FROM dataset
    

    输出:

    device_id date recordsNb
    abc 2021-07-24 2
    def 2021-07-24 3

    UPD

    由于你有ROWs,而不是json值,你可以尝试下一个:

    SELECT device_id,
        date,
        json_array_length(cast(records as json)) recordsNb
    FROM table
    

    【讨论】:

    • 我在我的数据集上得到了cannot cast row。这是一个存储在 DynamoDB 中的 json,其键值对如下 { "records": { "1598858047000": { "AB": 0 }, "1598858048000": { "BC": 0 } } } 我不知道为什么它不是工作
    • @QuentinDel 一种解决方法(虽然不是高效的)可以将记录转换为 json 然后映射。但性能不是很好。
    • 无法转换为 map(varchar, json)。期望一个 json 对象,但得到 [ [[0E-9],[0E-9]]
    • @QuentinDel 查看更新。
    • @QuentinDel 那么我建议在 github 上打开一个问题,或者修改数据导入,使其实际上作为字符串/json 导入
    【解决方案2】:
    select device_id, date, count(*) as recordsNb 
    from FROM "default"."table" 
    group by device_id, date
    

    【讨论】:

    • 感谢您的回复,实际上我想从每对设备 ID/日期的记录属性中计算记录“键”的数量。我已经编辑了我的问题以提供更多背景信息。
    • 记录列是什么数据类型?
    • 在 DynamoDB 中它是一个 json,但在 Athena 中它显示为 ``` struct,1579518772000:struct,1579529572000:struct,1579554776000: struct> ``
    • 我其实是想统计一下这个json的根键的个数
    猜你喜欢
    • 2020-05-02
    • 2020-09-09
    • 2012-04-13
    • 2022-10-04
    • 1970-01-01
    • 2021-12-17
    • 2020-11-02
    • 2021-02-19
    • 2018-12-03
    相关资源
    最近更新 更多