在 aws athena 中聚合项目 sql

Aggregating items in aws athena sql

给定一个如下所示的数据库:

item vietnamese cost unique_id
fruits trai cay 10 abc123
fruits trai cay 8 foo99
fruits trai cay 9 foo99
fruits trai cay 12 abc123
fruits trai cay 14 abc123
vege rau 3 rr1239
vege rau 3 rr1239

通过 AWS Athena 查询时:

SELECT item, 
    sum(cost) as sum_cost, 
    avg(cost) as avg_cost, 
    array_agg(vietnamese) as vietnamese,
    array_agg(cost) as costs,
    array_agg(unique_id) as unique_ids
FROM foodtable
GROUP BY item
ORDER BY avg_cost

我会得到一组重复的越南语翻译:

item vietnamese
fruits [trai cay, trai cay, trai cay, trai cay, trai cay]

有没有办法只保留 vietnamese 列中的 last/first 值?

此外,对于上面的查询,unique_ids 值将如下所示:

item unique_ids
fruits [abc123, foo99, foo99, abc123, abc123]

有没有办法聚合计数并保留一个计数器列来实现?

item unique_ids
fruits [abc123:3, foo99:2]

目前,我已经尝试通过 set(vietnamese)collections.Counter(unique_ids) 的唯一性从 SQL 查询中获取结果后读取输出。但是,如果可以在 SQL 查询中执行此操作,那就更可取了。

Athena有很多操作数组的函数,比如filter, element_at, cardinality, reduce, as well as functions that create and process maps。您可以使用这些来处理聚合数组。

例如,要计算每个唯一 ID 的出现次数,您可以这样做:

SELECT
  item,
  transform_values(multimap_agg(unique_id, 1), (k, v) -> cardinality(v))
GROUP BY item