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(表分区)