【问题标题】:Data between quotes and field separator引号和字段分隔符之间的数据
【发布时间】:2012-09-07 06:09:11
【问题描述】:

在下面给出的示例中,最后一行没有上传。我收到一个错误:

Data between close double quote (") and field separator: 

这看起来像一个错误,因为管道符号之间的所有数据都应该被视为一个字段。

架构:一:串,二:串,三:串,四:串

上传文件:

This | is | test only | to check quotes
second | line | "with quotes" | no text
third line | with | "start quote" and | a word after quotes

处理上面的第一行和第二行。但不是第三个。


更新:

有人可以解释为什么以下工作除了第三行

This | is | test only | to check quotes
second | line | "with quotes" | no text
third line | with | "start quote" and | a word after quotes
forth line | enclosed | {"GPRS","MCC_DETECTED":false,"MNC_DETECTED":false} | how does this work?
fifth line | with | {"start quote"} and | a word after quotes

对此可能有一些奇特的解释。从最终用户的角度来看,这是荒谬的。

【问题讨论】:

  • 我刚刚尝试了您的更新,您提供的示例实际上不起作用。与大多数 CSV 解析应用程序一样,BigQuery 默认情况下将双引号(“)视为字段封闭字符。第 3 行未正确转义(请参阅下面的答案)并且摄取将引发错误。您的选择是: 1. 更改“configuration.load.quote”参数在你的摄取请求中对双引号以外的东西(一个没有出现在你的数据中的字符)。2.按照下面的建议转义你的数据......例如,Python的csv类就是这样做的自动。
  • 虽然考虑将“configuration.load.quote”设置为 NULL 之类的操作可能有好处,但我认为在工作时使用分隔符和字段封闭字符非常明确是很重要的包含大量 CSV 数据。它有助于捕获基础数据中的错误,并确保您提取的数据有效。
  • 尝试通过 Cloud SQL 作为替代方案:medium.com/google-cloud/…

标签: google-bigquery


【解决方案1】:

来自CSV RFC4180 page“如果使用双引号括住字段,则出现在字段中的双引号必须通过在其前面加上另一个双引号来进行转义。” p>

你可能想这样做:

This | is | test only | to check quotes
second | line | "with quotes" | no text
third line | with | " ""start quote"" and " | a word after quotes

更多关于我们的 CSV 输入格式here

【讨论】:

  • 请注意,您可以通过将加载作业配置中的“引号”字段设置为您永远不会使用的内容来更改引号字符。
  • 如何在加载作业中设置报价字段?如果我使用 bq load --quote '^' ... 那么我得到一个错误 FATAL Flags parsing error: Unknown command line flag 'quote' # if I add quote parameter in ~/.bigqueryrc 然后我得到错误 : Unknown flag configuration .load.quote 在 bigqueryrc 文件中找到
  • 我猜“quote”参数将在下一个版本中添加到 bq 命令行工具中。这个问题对我来说太重要了,我会等待新版本!
【解决方案2】:

您也可以在上传数据时使用其他标志。我使用了带有以下标志的 bq 工具

bq load -F , --source_format CSV --skip_leading_rows 1 --max_bad_records 1 --format csv -E UTF-8 yourdatset gs://datalocation.

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      使用--quote 效果很好。

      bq load 
      --source_format CSV --quote "" 
      --field_delimiter \t 
      --max_bad_records 10 
      -E UTF-8   
      destination table
      Source files 
      

      【讨论】:

      • 要清楚,这里的重点是您将一个空字符串传递给 --quote 标志
      【解决方案5】:

      尝试每次使用bq shell 加载。

      我必须加载 1100 列。在尝试使用带有所有错误选项的控制台时,它引发了很多错误。忽略控制台中的错误意味着丢失记录。

      因此尝试使用 shell 并成功加载所有记录。

      尝试以下方法:

      bq load --source_format CSV --quote "" --field_delimiter \t --allow_jagged_rows --ignore_unknown_values --allow_quoted_newlines --max_bad_records 10 -E UTF-8 {dataset_name}.{table_name} gs://{google_cloud_storage_location}/* {col_1}:{data_type1},{col_2}:{data_type2}, ....
      

      参考资料:

      https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-csv#bigquery_load_table_gcs_csv-cli
      
      https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-csv#csv-options
      

      【讨论】:

        【解决方案6】:

        试试这个作为替代方案:

        • 将 MySQL 备份文件加载到 Cloud SQL 实例中。
        • 直接从 MySQL 中读取 BigQuery 中的数据。

        更长的操作方法:

        【讨论】:

          猜你喜欢
          • 2021-03-14
          • 1970-01-01
          • 2022-11-24
          • 2017-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多