BigQuery 无法识别分区表谓词
Posted
技术标签:
【中文标题】BigQuery 无法识别分区表谓词【英文标题】:BigQuery doesn't recognize partitioned table predicate 【发布时间】: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 小时逻辑添加到左侧,包括分区字段。
您需要的是某种脚本 - 请参阅 ***.com/a/57862855/132438
【参考方案1】:
事实证明,在缩短此问题的代码时,我遗漏了包含错误的部分。正在做
WHERE l.timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 96 HOUR)
AND predicate2
OR predicate3
无效。
完整的代码是
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')
AND (module='bar' AND action='qux')
OR (module='foo' AND action='baz') -- bug is here
)
SELECT TO_JSON_STRING(e) payload
from events e
在原始代码中,我弄乱了括号,它应该是
WHERE l.timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 96 HOUR)
AND devicetype in ('desktop', 'mobile', 'tablet')
AND osname in ('Windows', 'Android', 'Mac OS', 'iOS')
AND ((module='bar' AND action='qux')
OR (module='foo' AND action='baz'))
【讨论】:
以上是关于BigQuery 无法识别分区表谓词的主要内容,如果未能解决你的问题,请参考以下文章