【发布时间】:2019-09-09 12:53:26
【问题描述】:
我在 BigQuery 中的 timestamp 列上有一个分区表,我希望提取过去 96 小时内发生的所有事件。
WITH events AS (
SELECT
concat(module, '_', replace(lower(action), ' ', '_')) type,
detail,
cast(IF(id=0, null, id) as string) id,
timestamp,
userId,
pageName,
FROM fe.logs l
WHERE l.timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 96 HOUR)
AND devicetype in ('desktop', 'mobile', 'tablet')
AND osname in ('Windows', 'Android', 'Mac OS', 'iOS'))
SELECT TO_JSON_STRING(e) payload
from events e
但我不断得到
Cannot query over table 'fe.logs' without a filter over column(s) 'timestamp' that can be used for partition elimination
我以为
WHERE l.timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 96 HOUR) 可以作为分区列的有效过滤器。
为了完整起见,我从查询中删除了一些列名和 WHERE 条件,但都没有触及 timestamp 列,所以我认为它们在这里无关紧要。
E:实际上,我从原始查询中省略了(现在添加了)另一部分,该部分将所有行转换为 JSON 以使其尽可能完整。
是否有一些特定的运算符或语法?
【问题讨论】:
-
你能添加一个
AND DATE(l.timestamp) >= DATE(TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 96 HOUR))的约束,看看它是否可以工作? -
在此处查看说明:cloud.google.com/bigquery/docs/…。您需要将 96 小时逻辑添加到左侧,包括分区字段。
-
您需要的是某种脚本 - 请参阅 stackoverflow.com/a/57862855/132438
标签: google-bigquery