【问题标题】:JSON formatting Error when loading into Google Big Query加载到 Google Big Query 时出现 JSON 格式错误
【发布时间】:2018-12-25 17:04:33
【问题描述】:

我正在尝试使用内置数据流模板从 PUBSUB 在 Big Query 中加载以下数据:

{
    "current_speed": "19.09",
    "_east": "-87.654561",
    "_last_updt": "2018-07-17 15:50:54.0",
    "_region_id": "1",
    "_north": "42.026444",
    "_south": "41.997946",
    "region": "Rogers Park - West Ridge",
    "_west": "-87.709645",
    "_description": "North of Devon. Kedzie to Lake Shore"
}

但我不断收到此错误:

“读取数据时出错,错误信息:解析JSON失败: 字符串意外结束;字符串意外结束;预期的密钥”

我实际上需要加载更大的数据集,如下所示:

 [{
    "current_speed": "19.09",
    "_east": "-87.654561",
    "_last_updt": "2018-07-17 15:50:54.0",
    "_region_id": "1",
    "_north": "42.026444",
    "_south": "41.997946",
    "region": "Rogers Park - West Ridge",
    "_west": "-87.709645",
    "_description": "North of Devon. Kedzie to Lake Shore"
}, {
    "current_speed": "25.23",
    "_east": "-87.747456",
    "_last_updt": "2018-07-17 15:50:54.0",
    "_region_id": "2",
    "_north": "42.0190998",
    "_south": "41.960669",
    "region": "Far North West",
    "_west": "-87.84621",
    "_description": "North of Montrose. East River to Cicero"
}

]

但是我得到了这个错误:

读取数据时出错,错误消息:无法解析 JSON:否 新数组启动时找到的对象。;开始数组返回假; 解析器在字符串结束前终止

我在这里做错了什么?

【问题讨论】:

  • 不清楚是谁/什么在发送该错误消息 - 以及您如何执行它。你能添加更多的实现细节吗?
  • 嗨@FelipeHoffa 感谢您的回复。我正在尝试使用 BQ UI 上传我的 JSON 以在实现管道之前对其进行测试。我实际上取得了一些进展。我发现 BQ 喜欢这个 "{ "current_speed" : "19.77", "_east" : "-87.654561", "_last_updt" : "2018-07-17 15:31:30.0", "_region_id" : "1 ","_north":"42.026444","_south":"41.997946","region":"罗杰斯公园 - 西岭","_west":"-87.709645","_description":"德文郡北部。 Kedzie 到 Lake Shore" }" 即元素之间没有换行符。但仍然不知道如何处理数组。
  • 再次澄清:我现在可以插入单个 json 对象,但不能插入数组。从我最初的对象中,我必须删除所有换行符并将整个内容压缩在一行中。我认为这很奇怪,但它至少可以工作。
  • 请针对新问题发布新问题 - 如果您不使用 Pub/Sub 或 Dataflow 直接导入 BigQuery,请注明。

标签: json google-bigquery


【解决方案1】:

要将 JSON 转换为新行分隔的 JSON(BigQuery 提取的格式),您可以使用 jq

$ cat a.json 
[{
    "key01": "value01",
    "key02": "value02",
    "keyN": "valueN"
},
{
    "key01": "value01",
    "key02": "value02",
    "keyN": "valueN"
},
{
    "key01": "value01",
    "key02": "value02",
    "keyN": "valueN"
}
]


$ cat a.json | jq -c '.[]'
{"key01":"value01","key02":"value02","keyN":"valueN"}
{"key01":"value01","key02":"value02","keyN":"valueN"}
{"key01":"value01","key02":"value02","keyN":"valueN"}

(见https://stackoverflow.com/a/51301075/132438

【讨论】:

  • 如果想转换一个大尺寸的文件怎么办?假设文件约为 7GB,似乎此命令不起作用。有什么建议吗?
  • 在mac os上,我没有安装jq(找不到命令),所以我运行了brew install jq
【解决方案2】:

是的,BigQuery 仅接受以换行符分隔的 JSON,这意味着每行一个完整的 JSON 对象。在您将对象合并到一行之前,BigQuery 会读取“{”,它是对象的开头,并希望读取一个键,但该行结束了,因此您会看到错误消息“期望键”。

对于多个 JSON 对象,只需将它们放在每一行中即可。不要将它们包含在数组中。 BigQuery 要求每一行都以一个对象“{”开头。如果您将“[”作为第一个字符,您将看到第二条错误消息,这意味着 BigQuery 读取的是数组但不在对象内部。

【讨论】:

  • 超级有趣。谢谢华。我有一个巨大的对象,我将其作为数组接收。现在我需要以某种方式将其转换为非数组。顺便说一句,BQ 不应该也能够处理数组吗?我希望这是一个很常见的情况,不是吗?
  • 支持对象内的数组。它转换为 BigQuery 中的 REPEATED 字段。但不接受对象外的数组。严格来说,您不能将 JSON 对象作为数组接收。 JSON 对象始终以“{”、json.org 开头。 JSON 对象可以有一个数组属性:{"string_array": ["apple", "banana"]}。
猜你喜欢
  • 2020-02-15
  • 2021-07-29
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
相关资源
最近更新 更多