使用 Athena / Presto 从多个表返回 SQL 数据,受 1 个表中的日期范围限制
Posted
技术标签:
【中文标题】使用 Athena / Presto 从多个表返回 SQL 数据,受 1 个表中的日期范围限制【英文标题】:Returning SQL data from multiple tables, limited by date range in 1 table using Athena / Presto 【发布时间】:2017-03-22 00:21:29 【问题描述】:我正在慢慢完成一个利用 AWS Athena 处理各种日志文件的项目。我的目标是使用日志文件进行事件关联,因此我需要找到某种方法来在给定时间范围内从单个 SQL 语句中选择和显示来自多个表的数据。这是我想要实现的一个示例:
scada.timestamp process.eventid scada.srcaddr process.requestid scada. action
2017-03-16T07:25:46.000Z c148e2ce-8500-467a-a970-ef1d43dd4aea 172.31.25.225 032bfafb-e8a3-4c06-a2dc-fa740abc135 ACCEPT
2017-03-16T07:25:46.000Z 8cc8143a-cf55-4db3-b112-0ff7f268edd0 172.31.25.225 f413e138-9445-408f-8124-ee6c33229889 ACCEPT
这是来自 2 个表的数据示例:
表 1:
SELECT eventtime, requestid, eventid FROM process_native limit 10;
eventtime requestid eventid
2016-05-07T08:57:37Z 032bfafb-e8a3-4c06-a2dc-fa740abc135c c148e2ce-8500-467a-a970-ef1d43dd4aea
2016-05-07T08:57:37Z f413e138-9445-408f-8124-ee6c33229889 8cc8143a-cf55-4db3-b112-0ff7f268edd0
表 2:
SELECT tstart, srcaddr, action FROM scada_raw limit 10;
tstart srcaddr action
1489509010 139.59.39.211 REJECT
1489509010 172.31.20.111 ACCEPT
由于表 2 将时间存储为 unix 时间,这会使事情变得有些复杂,因此我需要对其进行转换,以便使用通用的时间格式:
表2更新时间:
SELECT to_iso8601(from_unixtime(tstart)) as timestamp, srcaddr, action FROM scada_raw limit 10;
timestamp srcaddr action
2017-03-16T07:25:46.000Z 172.31.25.225 ACCEPT
2017-03-16T07:25:46.000Z 172.31.25.225 ACCEPT
坦率地说,我不知道该怎么做 :) 这是我想到的一个查询,它只是超时:
SELECT process_native.eventid,
process_native.requestid,
scada_raw.srcaddr,
scada_raw.action,
FROM process_native, scada_raw
WHERE scada_rawe.eventtime >= '2017-02-17T00:00:00Z'
AND scada_raw.eventtime < '2017-03-20T00:00:00Z'
我真的不知道下一步该去哪里,我已经用 SQL 工作了 3 天了,这超出了我的范围。我的目标还能实现吗?
谢谢!
【问题讨论】:
例子不清楚 这两个表是如何相互关联的? 对不起,这个例子对我来说很有意义,但我想那是因为我写了它:) 我正在寻找关联事件,这两个表除了事件时间之外没有任何共同点,甚至它们不会 100% 相同。我所追求的甚至可能无法实现,但我不知道是不是这样。我想指定一个时间范围,然后从两个表中返回该时间范围内的所有数据。例如,如果 scada 数据报告了错误,我想将 scada 中的所有数据汇总在一起,并处理事件期间捕获的日志。 【参考方案1】:即使您不能保证日期将匹配以进行正确连接,您也可以将记录彼此靠近。例如:
eventtime requestid eventid srcaddr action
2017-03-14 16:30:10.000 139.59.39.211 REJECT
2017-03-14 16:30:10.000 172.31.20.111 ACCEPT
2017-03-14 16:30:11.000 032bfafb-e8... c148e2ce-85...
2017-03-14 16:30:11.000 f413e138-94... 8cc8143a-cf...
来自这样的查询:
WITH TimelineRecords AS (
SELECT
eventtime,
requestid,
eventid,
NULL srcaddr,
NULL action
FROM
process_native
WHERE
eventtime BETWEEN timestamp '2017-03-14 16:30:00' AND timestamp '2017-03-14 16:35:00'
UNION ALL
SELECT
from_unixtime(tstart) eventtime,
NULL requestid,
NULL eventid,
srcaddr,
action
FROM
scada_raw
WHERE
from_unixtime(tstart) BETWEEN timestamp '2017-03-14 16:30:00' AND timestamp '2017-03-14 16:35:00'
)
SELECT
*
FROM
TimelineRecords
ORDER BY
eventtime;
很抱歉这两个 WHERE 子句,当我把它放在最后一个 select 语句上时,Athena 不喜欢它。
【讨论】:
以上是关于使用 Athena / Presto 从多个表返回 SQL 数据,受 1 个表中的日期范围限制的主要内容,如果未能解决你的问题,请参考以下文章
我可以在写之前使用 Athena / Presto 对表格进行排序吗?
AWS Athena [Presto] 如何仅接收过去 7 天的数据?
Presto/Athena - 查询以发现 JSON 属性频率?
如何将表示 EPOCH 时间的整数转换为 Athena (Presto) 中的时间戳?