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 无法识别分区表谓词的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 无法识别联接中子选择的字段

BigQuery 在解析时无法识别时区

如何从 BigQuery 读取分区表到 Spark 数据帧(在 PySpark 中)

Python 无法识别 csv 文件中的新行

Oracle ASM无法识别扩展分区的磁盘设备

Exsi 无法识别硬盘,如何格式化