使用 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) 中的时间戳?

在 athena/presto 中将数组(varchar)转换为 varchar

AWS Athena (Presto) DISTINCT SQL 查询中的重复结果?