在过去的几周里,我编写了一条管道,收集从网站上播放的所有点击流数据。管道以以下方式使用AWS : S3 > EC2 (用于转换)>雅典娜(扫描一个干净的分区s3)。每24小时就会有新的数据进入管道,这非常有用--我的点击流数据很容易被查询。但是,我现在需要添加一些额外的列,即每页所花费的时间。这可以通过通过用户ID、时间戳排序,然后取row_n1和row_n2的时间戳列之间的差异来实现。所以我的问题是:
1)如何通过SQL查询执行此操作?我很难让它工作,但我的想法是,一旦我这样做,我可以触发这个查询每24小时,运行新的点击流数据,即将进入雅典娜。
2)这是否是添加额外列或新的聚合表的合理方法?例如,构建一个查询,该查询每24小时在新数据上运行一次,以附加到新表。
理想情况下,我不想触及为执行“核心”ETL管道而编写的任何源代码
作为参考,我的表看起来类似于以下内容(在页面上花费了新的列时间):
userID,eventNum,分类,时间,时间.timeSpentOnPage = '103-1023‘3’View‘12-10-2019.’3‘s
感谢您所能提供的任何指导/建议。
发布于 2019-02-12 12:50:41
我不太清楚您在问什么,一些示例数据和预期的输出会有帮助。例如,我不太明白row_n
和row_m
是什么意思。
我猜您的意思是计算连续行的时间戳之间的差异。这样的查询就可以实现
SELECT
userID,
timestamp - LAG(timestamp, 1) OVER (PARTITION BY userID ORDER BY timestamp) AS timeSpentOnPage
FROM events
LAG
窗口函数返回窗口框架给出的窗口中上一行的值(在本例中,1
表示前一行)(在本例中,所有具有相同userID
并按timestamp
排序的行)。这有点像GROUP BY
,但是对于每一行,如果这是有意义的话。
它不会给你花在每一页上的时间,一些页面浏览量看起来会很长,而实际上它们之间并没有任何活动(比如有人浏览了一些页面,吃过午餐,浏览了更多的页面--午餐前的最后一个页面查看看起来像是覆盖了整个午餐)。
在雅典娜,没有办法做相当于UPDATE
的事情。最近的事情是做一个"CTAS“(创建表AS)来创建一个新的表(通过一些自动化,它可以转化为为现有表创建新的分区)。
如果你能提供更多关于你的数据的信息,我可以用其他的建议来修正这个答案。
https://stackoverflow.com/questions/54658335
复制