【问题标题】:Loading JSON file into BigQuery table: Schema changes将 JSON 文件加载到 BigQuery 表中:架构更改
【发布时间】:2017-01-03 08:00:08
【问题描述】:

我正在尝试将 json 文件加载到 BQ 表中。我的架构看起来像:

{"_eventid": "1234", "Keywords":""}
{"_eventid": "4567", "Keywords":{"_text":"abcd"} }

从上面,您可以看到“关键字”的架构发生了变化。我该如何处理?使用类似的东西:

  {
   "name":"Keywords",
   "type":"record",
   "mode":"nullable",
   "fields": [
   {
    "name":"_text",
    "type":"string",
    "mode":"nullable"
   }
   ]
},

仅适用于第二个条目。首先,我得到了错误:

Errors:
file-00000000: JSON table encountered too many errors, giving up.    Rows: 1; errors: 1. (error code: invalid)
JSON parsing error in row starting at position 0 at file: file- 00000000. Flat value specified for record field. Field: Keywords;     Value: (error code: invalid)

【问题讨论】:

    标签: json google-bigquery


    【解决方案1】:

    简答

    Bigquery 表受架构限制。每当我们尝试摄取不符合表模式的数据时,我们都会出错。在您的情况下,在第一条记录中,Keywords 的值是字符串,但在架构中,它是带有一个名称为 _text 的可空字段的记录。

    解决方法

    您需要在将数据加载到 bigquery 之前对其进行预处理。如果您有小的 json 文件,您可以编写脚本并检查 Keywords 的类型是记录还是字符串,如果是字符串则首先创建记录。所以预处理后的文件内容如下:

    {"_eventid": "1234", "Keywords":{"_text": ""}}
    {"_eventid": "4567", "Keywords":{"_text":"abcd"} }
    

    根据您的架构,Keywords 是可为空的记录。您甚至可以忽略 keywords 在预处理期间哪个值为空。在这一步之后,输入文件将变为。

    {"_eventid": "1234"}
    {"_eventid": "4567", "Keywords":{"_text":"abcd"} }
    

    【讨论】:

    • JSON 大约 30 GB,所以我必须考虑实现此解决方法的最佳方法。
    【解决方案2】:

    BigQuery 现在支持在加载时更改架构

    --schema_update_option=ALLOW_FIELD_ADDITION
    --schema_update_option=ALLOW_FIELD_RELAXATION
    

    选项。有关更多详细信息和 JSON 加载示例,请参阅 How to insert/append unstructured data to bigquery table

    【讨论】:

    • 我安装了最新的 Google SDK,但在尝试使用这些标志时不断收到错误:FATAL Flags parsing error: Unknown command line flag 'schema_update_option'。
    • 抱歉 - 看起来 bq CLI 更新正在等待下一个 SDK 版本,但它现在可以在 API 上使用。
    • 仍然得到原始错误:“RuntimeError:JSON 表遇到太多错误,放弃。行:1;错误:1. JSON 解析错误在文件中从位置 0 开始的行:file-00000000 . 为记录字段指定的平面值。字段:关键字;值:" 通过 API 运行时。
    • 您是否为加载命令提供了更新的架构(包含更多列)?加载失败的作业 ID 是什么 - 我可以检查一下。
    • 我正在本地机器上加载一个大约 10 行的测试 JSON 文件。 20% 包含字段“关键字”的平面结构,其余是嵌套的(即有“关键字”:{“_text”:“abcd”}})。作业 id 是 multiworldtesting-poc:job_6MVR46D3Q9XIuz0swhjtJn8KZKw
    猜你喜欢
    • 2018-07-31
    • 1970-01-01
    • 2020-03-22
    • 2017-07-07
    • 2013-05-18
    • 2019-07-11
    • 2022-01-22
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多