在过去的几周里,我编写了一个管道,用于获取从网站上广播的所有点击流数据。管道以下列方式使用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
感谢您提供的任何指导/建议。
我不完全确定你在问什么,一些示例数据和预期输出会有所帮助。例如,我不太明白row_n
和row_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)来创建一个新表(可以将一些自动化转换为为现有表创建新分区)。
如果您提供有关数据的更多信息,我可以使用其他建议修改此答案。