将新列添加到 Athena (Presto) table 通过取两行之间的差异计算

Adding a new column into Athena (Presto) table calculated by taking the difference between two rows

在过去的几周里,我编写了一个管道来收集从网站广播的所有点击流数据。管道以下列方式使用 AWS:S3 > EC2(用于转换)> Athena(扫描干净的分区 s3)。新数据每 24 小时进入一次管道,效果很好——我的点击流数据很容易查询。但是,我现在需要添加一些额外的列,即在每个页面上花费的时间。这可以通过按用户 ID、时间戳排序然后取 row_n1 和 row_n2 的时间戳列之间的差异来实现。所以我的问题是:

1) 如何通过 SQL 查询执行此操作?我正在努力让它工作,但我的想法是,一旦我这样做了,我就可以每 24 小时触发一次此查询,以 运行 进入 Athena 的新点击流数据。

2) 这是添加额外列或新聚合 table 的合理方法吗?例如,构建一个 运行 每 24 小时查询一次新数据以附加到新的 table.

理想情况下,我不想触及为 "core" ETL 管道

编写的任何源代码

作为参考,我的 table 看起来类似于以下内容(在页面上花费了新的专栏时间):

|用户名 |事件编号 |类别|时间 | ...... |页面停留时间 | '103-1023' '3' 'View' '12-10-2019...' 3s

感谢您提供的任何 direction/advice。

我不完全确定你在问什么,一些示例数据和预期输出会有所帮助。比如我不是很明白你说的row_nrow_m.

是什么意思

我猜你的意思是计算连续行的时间戳之间的差异。这可以通过像

这样的查询来实现
SELECT
  userID,
  timestamp - LAG(timestamp, 1) OVER (PARTITION BY userID ORDER BY timestamp) AS timeSpentOnPage
FROM events

LAG window function returns 前一行的值(1 在这种情况下表示前一行)在 window 给出window 框架(在本例中,所有具有相同 userID 并按 timestamp 排序的行)。它有点像 GROUP BY,但对于每一行,如果这有意义的话。

它不会完全显示您在每个页面上花费的时间,有些页面浏览量看起来很长,但实际上它们之间没有任何 activity(比如有人浏览了一些,去吃午饭了,又浏览了一些 - 午餐前的最后一次页面浏览看起来像是跨越了整个午餐时间)。


无法在 Athena 中执行与 UPDATE 相同的操作。最接近的事情是做一个 "CTAS" (Create Table AS) 来创建一个新的 table(通过一些自动化可以变成为现有的 table 创建新的分区)。

如果您提供有关数据的更多信息,我可以根据其他建议修改此答案。