Bigquery 返回重复的行以及错误的计数

Posted

技术标签:

【中文标题】Bigquery 返回重复的行以及错误的计数【英文标题】:Bigquery return duplicated rows as well as wrong count 【发布时间】:2017-09-28 17:16:35 【问题描述】:

我直接在用户界面上运行 BigQuery,查询结果重复(每行多一份)得到 120 个结果。我还用相同的语句测试了 select count(*),结果仍然是 120。即使将结果作为 csv 文件下载到本地磁盘,数据仍然是重复的。我环顾四周,但无法得到任何有用的观点。有什么建议吗?

    id 1 叫约翰 弗吉尼亚州 关键词老化 标题 budget_start 2016-01-30 budget_end 2018-03-31 total_cost 250000.0

id 为必填项,其他可以为空; budget_start 和budget_end 为日期类型,total_cost 为float,其他列为string

【问题讨论】:

我已经检查了我的数据表,完全没有重复的行。 显示查询并描述您查询的小表 SELECT id, name, state, keywords, title,total_cost FROM [xxx table] where budget_start > 2015-1-1 and budget_end > 2017-12-30 and total_cost > 1000000 and state contains 'MO ' 按 id DESC 排序; 您是否考虑过重复项实际上已经在您的表中而不是由您的查询生成的情况? 感谢您的中肯建议!我实际上发现了问题,我上传了两次表格(在第一次导入时发现一些错误,更正该错误并再次加载)导致表格内容重复(我认为已被替换但实际上已合并) 【参考方案1】:

根据您的查询 - 很明显您使用的是 BigQuery Legacy SQL Legacy SQL 的输出细节是它变得扁平 这意味着如果您有嵌套行 - 它们将被展平

见下例

#legacySQL
SELECT id, NEST(x) AS xs
FROM 
(SELECT 1 AS id, 2 AS x),
(SELECT 1 AS id, 3 AS x),
(SELECT 1 AS id, 4 AS x),
(SELECT 2 AS id, 5 AS x),
(SELECT 2 AS id, 6 AS x)
GROUP BY id  

它创建如下两行

Row id  xs  
1   1   [2,3,4]  
2   2   [5,6]  

您可以通过使用目标表运行此查询来检查这一点,然后预览此表

现在 - 如果您在 Web UI 中(在旧版 SQL 中)运行相同的查询 - 您将获得 5 行而不是“预期的”2 行

Row id  xs   
1   1   2    
2   1   3    
3   1   4    
4   2   5    
5   2   6      

另请注意:展平仅发生在最终外层 - 子查询不会展平。例如下面的查询会给你 count = 2 正如你所期望的那样

#legacySQL
SELECT COUNT(1) AS cnt FROM (
  SELECT id, NEST(x) AS xs
  FROM 
  (SELECT 1 AS id, 2 AS x),
  (SELECT 1 AS id, 3 AS x),
  (SELECT 1 AS id, 4 AS x),
  (SELECT 2 AS id, 5 AS x),
  (SELECT 2 AS id, 6 AS x)
  GROUP BY id
)  


Row cnt  
1   2    

所以,要解决这个问题 - 我建议你 migrate to BigQuery Standard SQL

查看 BigQuery 标准 SQL 的等效示例

#standardSQL
WITH `yourTable` AS (
  SELECT 1 AS id, [2,3,4] AS xs UNION ALL
  SELECT 2, [5,6]
)
SELECT * FROM `yourTable`

只有两行的输出,正如人们所期望的那样

Row id  xs   
1   1   2    
        3    
        4    
2   2   5    
        6    

【讨论】:

感谢您的回答!使用标准 SQL 和 count(*) 仍然会得到重复的行,好在日期条件语句在标准 SQL 中有效。 如果您展示您的表格架构以及您尝试完成的工作 - 我们可以进一步帮助您 id,name,state,keywords,title,budget_start,budget_end,total_cost,id为必填项,其他可以为null; budget_start 和budget_end 为日期类型,total_cost 为float,其他列为string 所以你没有任何记录类型 - 表格已经扁平化了。【参考方案2】:

非常感谢 Mikhail 提出的有见地的建议!我实际上发现了问题,我从 Google 存储中导入同一个表两次(在第一次导入时发现一些错误,更正该错误并再次加载)导致一个包含重复内容的表(我认为它已被替换但实际上已合并)我做了没意识到

【讨论】:

以上是关于Bigquery 返回重复的行以及错误的计数的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 上传作业返回错误 - 有效负载部分计数错误?

在 Big Query 的表中查找特定条件的属性计数

如何恢复 Big Query 中已删除的行?

当Big Query加载失败并且CSV表遇到太多错误时,获取更多信息,放弃[重复]

Big Query 返回的内部错误

BIG QUERY SQL:如何在具有相同唯一键但访问期间不同的访问中查找不同的重复集?