在 Google BigQuery 中创建 CSV 表的困难

Posted

技术标签:

【中文标题】在 Google BigQuery 中创建 CSV 表的困难【英文标题】:Difficulties creating CSV table in Google BigQuery 【发布时间】:2019-02-19 21:39:14 【问题描述】:

我在使用从其他系统下载的 CSV 数据在 Google BigQuery 中创建表时遇到了一些困难。

我们的目标是在 Google Cloud Platform 中有一个存储桶,我们将每月上传 1 个 CSV 文件。此 CSV 文件包含大约 3,000 - 10,000 行数据,具体取决于月份。

我从 Big Query API 的作业历史中得到的错误是:

读取数据时出错,错误信息:CSV 表也遇到 很多错误,放弃。行数:2949;错误: 1.请查看 errors[] 集合以获取更多详细信息。

当我上传 CSV 文件时,我选择以下内容:

文件格式:csv 表类型:原生表 自动检测:尝试自动和手动 分区:无分区 写入首选项:WRITE_EMPTY(无法更改) 允许的错误数:0 忽略未知值:未选中 字段分隔符:逗号 要跳过的标题行:1(也尝试了 0 并手动从 csv 文件中删除标题行)。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

通常指向数据源结构中的错误(在这种情况下是您的 CSV 文件)。由于您的 CSV 文件很小,您可以在运行导出之前运行一个小验证脚本来查看 CSV 中所有行的列数完全相同。

可能是这样的:

cat myfile.csv | awk -F, ' a[NF]++  END  for (n in a) print n, "rows have",a[n],"columns" '

或者,您可以将其绑定到条件(假设您的列数是否应为 5):

ncols=$(cat myfile.csv | awk -F, 'x=0; a[NF]++  END  for (n in a)print a[n]; x++; if (x==1)break'); if [ $ncols==5 ]; then python myexportscript.py; else echo "number of columns invalid: ", $ncols; fi;

【讨论】:

谢谢,@khan,一个小的修正是用 eq 而不是 == ncols=$(cat test.csv | awk -F, 'x=0; a[NF]++ END for (n in a)print a[n]; x++; if (x==1)break'); if [[ $ncols -eq 5 ]]; then python3 csv_validator.py; else echo "number of columns invalid: ", $ncols; fi; 这对我有用【参考方案2】:

没有看到示例 CSV 文件就不可能指出错误,但很可能您的文件格式不正确。结果,一个错字使 BQ 误以为有数千个。假设您有以下 csv 文件:

Sally Whittaker,2018,McCarren House,312,3.75
Belinda Jameson 2017,Cushing House,148,3.52 //Missing a comma after the name
Jeff Smith,2018,Prescott House,17-D,3.20
Sandy Allen,2019,Oliver House,108,3.48

使用以下架构:

Name(String)    Class(Int64)    Dorm(String)    Room(String)    GPA(Float64)

由于架构缺少逗号,因此所有内容都移动了一列。如果您有一个大文件,它会在尝试将字符串插入 Ints/Floats 时导致数千个错误。

我建议您先通过 csv 验证器运行您的 csv 文件,然后再将其上传到 BQ。它可能会找到破坏它的东西。甚至有可能您的某个字段在值内有一个逗号,这会破坏所有内容。

另一个需要研究的理论是确保所有必需的列都接收到适当的(非空)值。此错误的常见原因是如果您不正确地转换数据,这会为每一行中的特定字段返回空值。

【讨论】:

【参考方案3】:

正如Scicrazed 所述,此问题似乎是由于某些文件行的格式不正确而产生的,在这种情况下,需要验证内容数据才能找出导致此问题的具体错误。

我建议您检查errors[] collection,它可能包含有关可能导致流程失败的方面的其他信息。您可以使用返回有关您的 BigQuery 作业的详细信息的 Jobs: get 方法来执行此操作,或者参考包含服务报告的相同完整错误数据的 JobStatus Stackdriver 日志的 additionalErrors 字段。

【讨论】:

【参考方案4】:

我可能为时已晚,但文件似乎有一些错误(它可能是无法解析的字符或只是 int 列中的字符串)并且 BigQuery 无法自动上传。

您需要了解错误是什么并以某种方式修复它。一个简单的方法是在终端上运行这个命令:

bq --format=prettyjson show -j <JobID>

您将能够查看错误的其他日志,以帮助您了解问题。

如果错误只发生几次,您可以增加允许的错误数。 如果这种情况多次发生,您需要在上传 CSV 文件之前对其进行操作。

希望对你有帮助

【讨论】:

以上是关于在 Google BigQuery 中创建 CSV 表的困难的主要内容,如果未能解决你的问题,请参考以下文章

如何在 google bigquery 中创建计算列?

保存视图无法在 Google BigQuery 中创建有效的输出架构

在 BigQuery 中创建 Google Analytics“回访用户”指标时出现问题

从 Google 表格获取数据到 BigQuery

如何在Google Bigquery中创建按日期(每年)分区的表格

有没有办法在 Google Dataflow 中创建具有数据相关架构的 Bigquery 表?