在 Athena/Presto 中将数组拆分为列

Posted

技术标签:

【中文标题】在 Athena/Presto 中将数组拆分为列【英文标题】:Splitting an array into columns in Athena/Presto 【发布时间】:2019-05-13 13:17:48 【问题描述】:

我觉得这应该很简单,但我一直在努力寻找正确的术语,请多多包涵。

我有两列,timestampvoltages 这是数组

如果我做一个简单的

SELECT timestamp, voltages FROM table

然后我会得到以下结果:

|timestamp | voltages | |1544435470 |3.7352,3.749,3.7433,3.7533| |1544435477 |3.7352,3.751,3.7452,3.7533| |1544435484 |3.7371,3.749,3.7433,3.7533| |1544435490 |3.7352,3.749,3.7452,3.7533| |1544435497 |3.7352,3.751,3.7452,3.7533| |1544435504 |3.7352,3.749,3.7452,3.7533|

但我想拆分 voltages 数组,以便其数组中​​的每个元素都是它自己的列。

|timestamp | v1 | v2 | v3 | v4 | |1544435470 |3.7352 |3.749 |3.7433 |3.7533| |1544435477 |3.7352 |3.751 |3.7452 |3.7533| |1544435484 |3.7371 |3.749 |3.7433 |3.7533| |1544435490 |3.7352 |3.749 |3.7452 |3.7533| |1544435497 |3.7352 |3.751 |3.7452 |3.7533| |1544435504 |3.7352 |3.749 |3.7452 |3.7533|

我知道我可以这样做:

SELECT timestamp, voltages[1] as v1, voltages[2] as v2 FROM table

但我需要能够以编程方式执行此操作,而不是列出它们。

我是否遗漏了一些明显的东西?

【问题讨论】:

Daniel,SQL 是静态类型的。在执行查询之前需要知道结果列的数量,因此不能有v1, v2, ...(取决于数组的实际长度)。话虽如此,您仍然可以“以编程方式”生成 SQL。但是你不能让 SQL 单独为你做这件事。 谢谢 Piotr,我想知道,但我想如果是这种情况,可能有办法通过对第一个结果的二次查询来做到这一点。嗯。 这能回答你的问题吗? athena presto - multiple columns from long to wide 【参考方案1】:

如果您有固定长度的数组,这应该可以满足您的目的。 您需要首先将每个数组元素分解为它自己的行。您可以通过以下方式使用UNNEST 运算符执行此操作:

SELECT timestamp, volt
FROM table
CROSS JOIN UNNEST(voltages) AS t(volt)

使用结果表,您可以通过参考 Gordon Linoff here 的答案将具有相同时间戳的多行转换为多列

【讨论】:

谢谢你,有趣的方法。目前我不知道数组的长度。您认为这与我的问题中的最后一种方法相比有什么优势吗?我想说元素寻址更容易理解,但我不知道你建议的方法是否还有其他好处。

以上是关于在 Athena/Presto 中将数组拆分为列的主要内容,如果未能解决你的问题,请参考以下文章

用于 In Query 的 Athena/Presto 拆分字符串

在 Athena/Presto 中将 JSON 转换为 ARRAY<MAP>

Athena/Presto:复杂结构/数组

如何在 yii 视图中将内容拆分为列-单独的 div

在 SQL 中将分隔的行拆分为列

Athena (Presto) SQL 窗口函数