BigQuery 请求查找表之间的更改

Posted

技术标签:

【中文标题】BigQuery 请求查找表之间的更改【英文标题】:BigQuery request find changes between tables 【发布时间】:2020-03-03 17:20:45 【问题描述】:

我有一个名为 tableA 的表,格式如下: id val1 val2 val3 val4

然后我有一个名为 tableB 的表格,格式完全相同。 我想为 tableB 中的每一行检查 tableA 中是否存在具有相同 id 的行。 如果是,我想检查其他列中的任何值是否在两行之间有所不同。 如果这些行之间有任何列不同,我想在第三个表( tableC )中添加一行 格式如下: id val1 val2 val3 val4 val1_changed val2_changed val3_changed val4_changed today_date

如果未发生更改,则“已更改”列可以为空。

有没有“简单”的方法来做到这一点?

谢谢

【问题讨论】:

【参考方案1】:

这个怎么样:

(您可以聚合到数组以使比较更容易,但是您需要解聚合才能进入 cols)

CREATE TEMPORARY FUNCTION compareCols( a ANY TYPE , b ANY TYPE )
AS ((
 SELECT STRUCT(arr[OFFSET(0)] AS col1_ch, arr[OFFSET(1)] AS col2_ch, arr[OFFSET(2)] AS col3_ch, arr[OFFSET(3)] AS col4_ch)
 FROM (
   SELECT ARRAY_AGG(IF(av!=bv, bv, null) ORDER BY i) arr
   FROM UNNEST(a) av WITH OFFSET i
   JOIN UNNEST(b) bv WITH OFFSET i
   USING (i)
 )
));

WITH data AS (
  SELECT title, DATE(datehour) date
    , SUM(IF(EXTRACT(HOUR FROM datehour)=7, views, null)) col1
    , SUM(IF(EXTRACT(HOUR FROM datehour)=8, views, null)) col2
    , SUM(IF(EXTRACT(HOUR FROM datehour)=9, views, null)) col3
    , SUM(IF(EXTRACT(HOUR FROM datehour)=10, views, null)) col4
  FROM `bigquery-public-data.wikipedia.pageviews_2020` 
  WHERE wiki='en'
  AND title LIKE 'Presi%'
  AND views > 0
  AND DATE(datehour) BETWEEN '2020-01-10' AND '2020-01-11'
  GROUP BY title, date
  HAVING col1*col2*col3*col4>53500
), data1 AS (
  SELECT *
  FROM data
  WHERE date = '2020-01-10'
  ORDER BY col1+col2+col3+col4 DESC
), data2 AS (
  SELECT *
  FROM data
  WHERE date = '2020-01-11'
)


SELECT data1, compareCols([data1.col1, data1.col2, data1.col3, data1.col4], [data2.col1, data2.col2, data2.col3, data2.col4]) changes
FROM data1 
JOIN data2
USING(title)

【讨论】:

以上是关于BigQuery 请求查找表之间的更改的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 在插入表时调用查询

BigQuery - 使用更改/删除的记录更新表

使用自定义目标接收器将日志导出到 BigQuery(表分区)

在 BigQuery 中恢复过期的 Firebase 表并将数据保存时间超过 60 天

如何使用python修复在bigquery中上传csv文件

从 BigQuery 缓慢更改查找缓存 - Dataflow Python 流式 SDK