我在BigQuery中有一个包含某种类型活动的表,现在只有大约40Mb的数据。活动日期存储在其中一个字段中(字符串格式为YYYY-MM-DD HH:MM:SS)。我需要找到方法来确定运行合理时间的不活动时段(有一些预定义的阈值)。
我构建的查询已经运行了一小时。这是:
SELECT t1.date, MIN(PARSE_UTC_USEC(t1.date) - PARSE_UTC_USEC(t2.date)) AS mintime
FROM logs t1
JOIN (SELECT date, http_error FROM logs) t2 ON t1.http_error = t2.http_error
WHERE PARSE_UTC_USEC(t1.date) > PARSE_UTC_USEC(t2.date)
GROUP BY t1.date
HAVING mintime > 1000;
想法是: 1.对表进行decart乘法(http_error是几乎从不改变值的字段,所以它可以做到这一点) 2.只选择date1>的对。 DATE2 3.对每个date1 date2采取最小差异 4.在最小差异大于阈值的情况下限制选择。
我承认我使用的真实查询是对无效数据的修复所带来的负担(这会增加额外的操作)。但我真的需要更好的想法来做到这一点。我很高兴听到其他想法
答案 0 :(得分:0)
我不知道您要查找的不活动的粒度,但为什么不尝试按时间戳划分,然后计算每个桶中活动的相对频率:
SELECT
UTC_USEC_TO_HOUR(PARSE_UTC_USEC(timestamp_usec)) AS hour_bucket,
COUNT(*) as activity_count
GROUP BY
hour_bucket
ORDER BY
activity_count ASC;