BigQuery 更新与内部联接

Posted

技术标签:

【中文标题】BigQuery 更新与内部联接【英文标题】:BigQuery Update with Inner join 【发布时间】:2019-09-13 23:09:02 【问题描述】:

是否可以基于 JOIN 与 BigQuery 中的现有表对表执行更新?

此查询中没有任何双精度数

SELECT profile_id, count(*) as cnt 
FROM `instagram-tags-c67d8.sample_dataset.influence` 
GROUP BY profile_id HAVING cnt > 1

它也适用于

select a.profile_id, b.username
from  `instagram-tags-c67d8.sample_dataset.influence` AS a
inner join (
  SELECT
    DISTINCT profile_id, username 
FROM `instagram-tags-c67d8.sample_dataset.profile_id_lut`) AS b 
ON a.profile_id = b.profile_id
where a.username is null

现在我只有这个问题 UPDATE/MERGE 必须与每个目标行最多匹配一个源行

UPDATE
  `instagram-tags-c67d8.sample_dataset.influence` AS a
SET
  a.username = b.username
FROM (
  SELECT
    DISTINCT profile_id, username 
FROM `instagram-tags-c67d8.sample_dataset.profile_id_lut`) AS b
WHERE
  a.username IS NULL
  AND a.profile_id = b.profile_id

【问题讨论】:

该错误似乎表明profile_id_lut 中有多个记录与influence 中的给定profile_id 匹配。 是的,没错 好的,那么您想如何处理该用例?也许从可用的usernames 中选择最大值或最小值? 所以,数据库有很多行不同的用户名,但唯一的 profile_id SELECT profile_id, count(*) as cnt FROM ( SELECT DISTINCT profile_id, username FROM instagram-tags-c67d8.sample_dataset.profile_id_lut ) b GROUP BY profile_id HAVING cnt > 1; 因此,我认为最好的办法是删除旧用户名 【参考方案1】:

该错误似乎表明profile_id_lut 中有多个记录与表influence 中的给定profile_id 匹配。

您必须首先决定如何处理该用例。可能的选项包括:

从源表profile_id_lut中删除重复记录 从可用的usernames 中选择最大值或最小值 选择profile_id最大或最小的用户名

最佳选择取决于您的功能用例,无法根据您问题中提供的信息进行评估...

【讨论】:

以上是关于BigQuery 更新与内部联接的主要内容,如果未能解决你的问题,请参考以下文章

联接表结果 Google BigQuery

BigQuery 无法识别联接中子选择的字段

BigQuery 交叉联接失败

BigQuery 中的联接性能缓慢

BigQuery:加入集群字段

如何使用 Apache BEAM 在 BigQuery 中执行快速联接