【问题标题】:Querying a Partitioned table in BigQuery using a reference from a joined table使用联接表中的引用查询 BigQuery 中的分区表
【发布时间】:2018-07-31 10:44:43
【问题描述】:

我想运行一个查询,使用表 B 中的值对表 A 进行分区。 例如:

#standard SQL
select A.user_id
from my_project.xxx A
inner join my_project.yyy B
on A._partitiontime = timestamp(B.date)
where B.date = '2018-01-01'

此查询将扫描表 A 中的所有分区,并且不会考虑我在 where 子句中指定的日期(用于分区目的)。我尝试以几种不同的方式运行此查询,但都产生了相同的结果——扫描表 A 中的所有分区。 有什么办法解决吗?

提前致谢。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    使用 BigQuery scripting(现在是测试版),有一种方法可以修剪分区。

    基本上,脚本变量被定义为捕获子查询的动态部分。然后在后续查询中,使用脚本变量作为过滤器来修剪要扫描的分区。

    DECLARE date_filter ARRAY<DATETIME> 
      DEFAULT (SELECT ARRAY_AGG(date) FROM B WHERE ...);
    
    select A.user_id
    from my_project.xxx A
    inner join my_project.yyy B
    on A._partitiontime = timestamp(B.date)
    where A._partitiontime IN UNNEST(date_filter)
    

    【讨论】:

      【解决方案2】:

      doc says 这个关于你的用例:

      尽可能接近表格表达谓词过滤器 标识符。需要评估多个复杂查询 查询的各个阶段以解析谓词(例如内部 查询或子查询)不会从查询中删除分区。

      以下查询不会修剪分区(注意使用子查询):

      #standardSQL
      SELECT
        t1.name,
        t2.category
      FROM
        table1 t1
      INNER JOIN
        table2 t2
      ON
        t1.id_field = t2.field2
      WHERE
        t1.ts = (SELECT timestamp from table3 where key = 2)
      

      【讨论】:

      • 这个方案恐怕也是扫描整个表。查询先扫描table1中的所有分区,然后才根据table3应用的条件过滤相关数据。
      • 如果您阅读了我的消息,我确认这会扫描所有表(不修剪分区意味着它会扫描所有表)。
      • 感谢 Pentium10。我刚刚意识到你在陈述谷歌文档。如果我理解正确,那么我的问题的答案是 - 没有办法使用来自不同表的值来修剪分区。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多