合并 2 个分区表 BigQuery

Posted

技术标签:

【中文标题】合并 2 个分区表 BigQuery【英文标题】:Merging 2 partitioned tables BigQuery 【发布时间】:2020-10-09 14:32:46 【问题描述】:

我正在尝试在 BigQuery 中合并 2 个分区表:

'source_t' 是一个源表。它通过 Ingestion Time 和 Partition filter 进行分区 –

Required. Pseudo field _PARTITIONTIME is timestamp

'target_t' 是一个使用分区过滤器按字段“日期”分区的目标表

Required. Field date is date

我想从 表的最后一个分区获取数据并将其合并到 目标 表。要过滤 tagret 表上的搜索任务,我需要使用 source 表数据中的“日期”字段。我写了一个查询,但编辑器显示以下查询错误:

如果不过滤列“日期”,则无法查询表“MyDataSet.target_t”

这是我的查询:

declare latest default (select date(max(_PARTITIONTIME)) as latest from MyDataSet.source_t where _PARTITIONTIME >= timestamp(date_sub(current_date(),interval 1 day))); 
declare first_date default (select min(date) as first_date from MyDataSet.source_t where date(_PARTITIONTIME) = latest);
merge `MyDataSet.target_t` as a
using (select * from `MyDataSet.source_t` where _PARTITIONTIME = latest) as b 
on
  a.date >= first_date and
  a.date = b.date and
  a.account_id = b.account_id and 
  a.campaign_id = b.campaign_id and 
  a.adset_id = b.adset_id and 
  a.ad_id = b.ad_id 
when matched then update set 
  a.account_name = b.account_name, 
  a.campaign_name = b.campaign_name, 
  a.adset_name = b.adset_name, 
  a.ad_name = b.ad_name, 
  a.impressions = b.impressions, 
  a.clicks = b.clicks, 
  a.spend = b.spend, 
  a.date = b.date 
when not matched then insert row;

如果我输入日期而不是“最新”变量(“where _PARTITIONTIME = '2020-10-01') as b”),则不会出现任何错误。但我想正确过滤源表。 而且我不明白它如何影响下面的“on”声明以及为什么一切都坏了>。

【问题讨论】:

【参考方案1】:

声明最新的时间戳

您的变量 latest 是一个 TIMESTAMP。将其设置为 DATE 类型,然后您的查询应该可以工作。

--------更新--------

错误是抱怨 MyDataSet.target_t 在日期列上没有一个好的过滤器。你能不能尝试把on 子句放在a.date = latest 之后(如果这不是正确的过滤器,想出其他constant 过滤器)

【讨论】:

谢谢。我将代码更改为“声明最新默认值(从MyDataSet.source_t 中选择最新默认值(选择日期(max(_PARTITIONTIME)),其中_PARTITIONTIME >= 时间戳(日期子(当前_日期(),间隔1天)));声明第一个日期默认值(选择最小值( date) as first_date from MyDataSet.source_t where date(_PARTITIONTIME) = latest); 合并 MyDataSet.target_t as a using (select * from MyDataSet.source_t where date(_PARTITIONTIME) = latest) as b" 但它仍然导致相同的错误( UPD:我用简单的选择尝试了另一个查询,一切正常:“从MyDataSet.source_t 声明最新默认值(选择 max(_PARTITIONTIME) 为最新,其中 _PARTITIONTIME >= timestamp(date_sub(current_date() ,interval 1 day))); 声明 first_date 默认(select min(date) as first_date from MyDataSet.source_t where _PARTITIONTIME = latest); select * from MyDataSet.target_t where date >= first_date limit 100;" 再次感谢您。问题似乎是因为 Google 无法预测要修剪的分区:cloud.google.com/bigquery/docs/… 我认为 2 个变量的原因 Google 不知道他应该使用哪些日期来修剪分区,他打算在搜索期间搜索所有分区。不知道是不是脚本或者编译器新功能的错误。

以上是关于合并 2 个分区表 BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

查询按分区字段分区的 BigQuery 表

BigQuery 最大分区数达到 2000 而不是 2500

linux 如何合并2个分区

多日期数据加载到 BigQuery 分区表中

BigQuery:计算每日分区表中的平均值

bigquery 表可以创建的最大分区数