在Google BigQuery中创建CSV表的困难

在Google BigQuery中创建CSV表的困难,csv,google-bigquery,Csv,Google Bigquery,我在使用从另一个系统下载的CSV数据在Google BigQuery中创建表时遇到了一些困难 我们的目标是在谷歌云平台上有一个bucket,我们将每月上传一个CSV文件。这个CSV文件有大约3000-10000行数据,具体取决于月份 我从大查询API中的作业历史记录中得到的错误是: 读取数据时出错,错误消息:也遇到CSV表 很多错误,放弃。行:2949;错误:1。请检查一下房间 有关详细信息,请参阅错误[]集合 上载CSV文件时,我选择以下选项: 文件格式:csv 表类型:本机表 自动检测:尝试

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

我们的目标是在谷歌云平台上有一个bucket,我们将每月上传一个CSV文件。这个CSV文件有大约3000-10000行数据,具体取决于月份

我从大查询API中的作业历史记录中得到的错误是:

读取数据时出错,错误消息:也遇到CSV表 很多错误,放弃。行:2949;错误:1。请检查一下房间 有关详细信息,请参阅错误[]集合

上载CSV文件时,我选择以下选项:

文件格式:csv 表类型:本机表 自动检测:尝试自动和手动 分区:没有分区 写入首选项:write_EMPTY无法更改此选项 允许的错误数:0 忽略未知值:未选中 字段分隔符:逗号 要跳过的标题行:1还尝试了0并手动从csv文件中删除标题行。
非常感谢您的帮助。

如果不查看示例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)
由于架构缺少逗号,因此所有内容都会被移动一列。如果您有一个大文件,它会在尝试将字符串插入int/float时导致数千个错误

我建议您在上传到BQ之前,先通过csv验证程序运行csv文件。它可能会找到打破它的东西。甚至有可能您的某个字段的值中有一个逗号,它会打断所有内容

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

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


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

我可能太晚了,但文件似乎有一些错误—可能是无法解析的字符,也可能只是int列中的字符串,BigQuery无法自动上载

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

bq --format=prettyjson show -j <JobID>
您将能够看到错误的其他日志,以帮助您理解问题

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

希望对您有所帮助

这通常指向数据源结构中的错误,在本例中是您的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++;如果x==1{break}}}';如果[$ncols-等式5]];然后是python3 csv_validator.py;else回送列数无效:,$ncols;fi;这对我有用