amazon-web-services - AWS Athena 是否支持在 Array_AGG 中排序?
问题描述
我与 AWS Athena 合作将几行连接到一行。
示例表:(名称:卸载)
xid pid sequence text
1 1 0 select * from
1 1 1 mytbl
1 1 2
2 1 0 update test
2 1 1 set mycol=
2 1 2 'a';
所以想联系文字栏目。
预期输出:
xid pid text
1 1 select * from mytbl
2 1 update test set mycol='a';
我运行以下查询首先以正确的顺序对其进行分区并执行连接。
with cte as
(SELECT
xid,
pid,
sequence,
text,
row_number()
OVER (PARTITION BY xid,pid
ORDER BY sequence) AS rank
FROM unload
GROUP BY xid,pid,sequence,text
)
SELECT
xid,
pid,
array_join(array_agg(text),'') as text
FROM cte
GROUP BY xid,pid
但是,如果您看到以下输出,则订单放错了位置。
xid pid text
1 1 mytblselect * from
2 1 update test'a'; set mycol=
我查看了 Presto 文档,最新版本支持 order by in array agg,但 Athena 使用的是 Presto 0.172,所以我不确定它是否支持。
在 Athena 中解决此问题的方法是什么?
解决方案
一种方法:
- 创建具有可排序格式的记录
text
- 聚合成一个未排序的数组
- 对数组进行排序
- 将每个元素转换回原始值
text
- 将排序后的数组转换为字符串输出列
WITH cte AS (
SELECT
xid, pid, text
-- create a sortable 19-digit ranking string
, SUBSTR(
LPAD(
CAST(
ROW_NUMBER() OVER (PARTITION BY xid, pid ORDER BY sequence)
AS VARCHAR)
, 19
, '0')
, -19) AS SEQ_STR
FROM unload
)
SELECT
xid, pid
-- make sortable string, aggregate into array
-- then sort array, revert each element to original text
-- finally combine array elements into one string
, ARRAY_JOIN(
TRANSFORM(
ARRAY_SORT(
ARRAY_AGG(SEQ_STR || text))
, combined -> SUBSTR(combined, 1 + 19))
, ' '
, '') AS TEXT
FROM cte
GROUP BY xid, pid
ORDER BY xid, pid
此代码假定:
xid
++对所有输入记录都是唯一pid
的sequence
xid
++的组合不多(例如不超过2000万pid
)sequence
推荐阅读
- python - 无法在 Python 中使用外部函数更改类变量
- php - 使用 Laravel 测试 JSON 响应
- python - 寻找一种更有效的方法来从数据框列中的字典创建新列
- google-container-os - 如何向 COS 的开发者提供反馈?
- python - 在 Web 浏览器中显示 Linux 命令的输出 - Python
- firebase - 在内部托管 Firebase 实时数据库
- jenkins - Jenkins xcode 插件错误地报告没有配置开发人员配置文件
- ajax - Datatables Ajax 无法渲染 Vue 组件
- php - Stripe Checkout Link onClick 不处理付款
- date - ionic 3 dateTime - displayFormat="HH:mm [Uhr]" 将 Uhr 中的 h 转换为时间,如何忽略它?