【问题标题】:Difficulties creating CSV table in Google BigQuery在 Google BigQuery 中创建 CSV 表的困难
【发布时间】: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 文件中删除标题行)。

任何帮助将不胜感激。

【问题讨论】:

    标签: csv google-bigquery


    【解决方案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 文件之前对其进行操作。

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-16
          • 1970-01-01
          • 2023-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多