【问题标题】:BigQuery asks for a partition filter while a filter existsBigQuery 在存在过滤器时要求提供分区过滤器
【发布时间】:2021-11-25 00:25:27
【问题描述】:

我们有一个连接两个表的 BigQuery 查询,其中一个表在 DATE 分区。作为第一步,我在查询中添加了一个日期文字,效果很好。

选择 a.hello,b.ciao 从表 a INNER JOIN 表 b ON a.time = b.time AND b.date = '2021-10-03'

现在是时候添加多天 this 以仅修剪相关的分区了。

尝试一:使用子查询,这样不行,不允许子查询

选择 a.hello,b.ciao 从表 a INNER JOIN 表 b ON a.time = b.time AND b.date IN (SELECT mytimes FROM table)

尝试二:使用 ARRAY 和 UNNEST,不起作用(当您根本没有过滤器时,我收到相同的错误:错误:无法在没有过滤器的情况下查询表)

Querying a Partitioned table in BigQuery using a reference from a joined table

声明 date_filter 数组 DEFAULT (SELECT ARRAY_AGG(day) FROM table);

选择 a.hello,b.ciao 从表 a INNER JOIN 表 b ON a.time = b.time AND b.date IN UNNEST(data_filter)

我认为很容易的事情似乎并不那么容易,有人可以指导我解决问题吗?非常感谢。

【问题讨论】:

    标签: google-bigquery partitioning


    【解决方案1】:

    尝试将b.date IN UNNEST(data_filter)ON移动到WHERE

    SELECT a.hello,b.ciao FROM table a INNER JOIN table b ON a.time = b.time WHERE b.date IN UNNEST(data_filter)
    

    【讨论】:

    • 您好 Sergey,但是第一次尝试我们了解到,当您在 where 子句中使用过滤器时,连接处没有分区修剪。我将再试一次,以确保在 where 子句中使用过滤器时不会消除分区。
    【解决方案2】:

    无法在没有过滤器的情况下查询表

    您可以“删除”该要求,该要求是在创建表时设置的

     ALTER TABLE mydataset.mytable
     SET OPTIONS (
       require_partition_filter=false
     )
    

    【讨论】:

    • 你好,米哈伊尔,谢谢你的回答。我们想真正使用分区,所以跳过分区修剪不是一种选择。
    • 不需要过滤器 - 与分区修剪无关!它仍在发生!
    【解决方案3】:

    它必须在 ON 子句中。将选择的结果存储在变量中。动态准备查询,然后执行。

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2022-01-22
    • 2018-05-02
    • 2019-01-04
    相关资源
    最近更新 更多