通过获取两行之间的差异,将新列添加到Athena(Presto)表中

问题描述 投票:0回答:1

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

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

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

理想情况下,我不想触及任何已编写的用于执行“核心”ETL管道的源代码

作为参考我的表看起来类似于以下(在页面上花费新的列时间):

| userID | eventNum |分类|时间| ...... | timeSpentOnPage | '103-1023''3''查看''12 -10-2019 ...'3s

感谢您提供的任何指导/建议。

sql bigdata amazon-athena presto
1个回答
0
投票

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

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

SELECT
  userID,
  timestamp - LAG(timestamp, 1) OVER (PARTITION BY userID ORDER BY timestamp) AS timeSpentOnPage
FROM events

LAG window function返回窗口框架给出的窗口中前一行的值(在本例中为1,意思是前一行)(在这种情况下,所有行具有相同的userID并按timestamp排序)。它有点像GROUP BY,但对于每一行,如果这是有道理的。

它不会给你在每个页面上花费的时间,一些页面浏览看起来很长,而实际上它们之间没有任何活动(比如有人浏览了一些,去吃午餐,浏览了更多 - 午餐前的最后一页视图看起来就像整个午餐一样。


在雅典娜没有办法相当于UPDATE。最接近的是做一个"CTAS" (Create Table AS)来创建一个新表(可以将一些自动化转换为为现有表创建新分区)。

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

© www.soinside.com 2019 - 2024. All rights reserved.