在 BigQuery 中读取时,未定义行 XXXX、列 xx-xx 处的 JSON 输入意外结束

Posted

技术标签:

【中文标题】在 BigQuery 中读取时,未定义行 XXXX、列 xx-xx 处的 JSON 输入意外结束【英文标题】:Unexpected end of JSON input at undefined line XXXX, columns xx-xx while reading in BigQuery 【发布时间】:2020-01-21 22:35:17 【问题描述】:

我在 Bigquery 中有一个表,它有 2 列 - job_idjson_column(JSON 格式的字符串)。当我试图读取数据并识别一些对象时,它给了我如下错误:

SyntaxError:Unexpected end of JSON input at undefined line XXXX, columns xx-xx

它总是给我第 5931 行,第二次我再次执行它给我第 6215 行。

如果是JSON结构问题,我怎么知道5931对应的是哪一行/job_id?如果我为特定的job_id 设置子集,它会返回值,但是当我尝试在完整的表上执行时,我得到了这个错误。我尝试查看提到的 row_numbers 处的 job_id,代码对那些 job_ids 工作正常。

你认为它的JSON结构有问题,如何识别哪一行/job_id有这个问题?

表结构:

代码:

CREATE TEMPORARY FUNCTION CUSTOM_JSON_EXTRACT(json STRING, json_path STRING)
    RETURNS ARRAY<STRING>
    LANGUAGE js AS """
      var result = jsonPath(JSON.parse(json), json_path);
      if(result)return result; 
      else return [];
    """
    OPTIONS (
        library="gs://json_temp/jsonpath-0.8.0.js"
    );

SELECT job_id,dist,gm,sub_gm
FROM lz_fdp_op.fdp_json_file,
UNNEST(CUSTOM_JSON_EXTRACT(trim(conv_column), '$.Project.OpsLocationInfo.iDistrictId')) dist ,
UNNEST(CUSTOM_JSON_EXTRACT(trim(conv_column), '$.Project.GeoMarketInfo.Geo')) gm,
UNNEST(CUSTOM_JSON_EXTRACT(trim(conv_column), '$.Project.GeoMarketInfo.SubGeo')) sub_gm 

【问题讨论】:

看起来像 JSON 数据的问题。您可以使用任何在线 JSON 编辑器来定位 json 的问题。顺便说一句,为什么你不在这里使用内置的 JSON_EXTRACT 函数。在您的 jsonpath 中看不到任何内置 JSON_EXTRACT 或 JSON_EXTRACT_SCALAR 不支持的内容 @MikhailBerlyant - 谢谢,我刚刚使用了内置的 JSON_EXTRACT 它适用于这种情况......唯一的问题是如何在不使用 unnest 的情况下读取 JSON 中的对象中的多个数组..我会提出单独一个问题 @Nanda 你能否代替粘贴图片粘贴文本 JSON sn-p 示例。如果无法访问提到第 5931 行的实际完整文件,第 6215 行完全没用,最好将您的问题重构为包含最小用例(提供准确的 json 示例并解释实际和预期的输出)。 【参考方案1】:

这对你有用吗?

WITH 

T AS (
  SELECT
    '1000149.04.14' AS job_id,
    '"Project":"OpsLocationInfo":"iDistrictId":"A","GeoMarketInfo":"Geo":"B","SubGeo":"C"' AS conv_column
)

SELECT
  JSON_EXTRACT_SCALAR(conv_column, '$.Project.OpsLocationInfo.iDistrictId') AS dist,
  JSON_EXTRACT_SCALAR(conv_column, '$.Project.GeoMarketInfo.Geo') AS gm,
  JSON_EXTRACT_SCALAR(conv_column, '$.Project.GeoMarketInfo.SubGeo') AS sub_gm
FROM
  T

BigQuery JSON 函数文档: https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions

如何在不使用 JSON 的情况下读取对象中的多个数组 没有嵌套?

您能否通过输入示例更好地解释您的评论?

【讨论】:

我需要从 Combos 中读取所有 ID。它存在于具有 JSON 结构的字符串字段中。示例数据如下: "Combos": [ "Id": "1111", "Type": 0, "Description": "ABCD", "ComboDuration": " StartDate": "2009-10-26T08:00:00", "EndDate": "2009-10-29T08:00:00" , "Id": "2222", "Type": 1, "描述": "XYZ", "ComboDuration": "StartDate": "2019-10-26T08:00:00", "EndDate": "2019-10-29T08:00:00" ] 那么可能你将不得不使用 UNNEST 来迭代数组,然后提取你的标量,但如果你在另一个问题中问这个问题,那么猜测这个问题已经解决了。 @MikhailBerlyant 和 fpopic - 感谢您的解决方案。我发现了问题,这是结构不完整的传入数据,所以我们得到了这些“在第 xxxxx 行输入的意外结束”。我已经解决了 UNNEST 的传入数据和解决方案的问题,MikahilBerlyant 提供的修复适用于我迄今为止测试过的大多数嵌套数据

以上是关于在 BigQuery 中读取时,未定义行 XXXX、列 xx-xx 处的 JSON 输入意外结束的主要内容,如果未能解决你的问题,请参考以下文章

无法读取未定义和未处理的承诺拒绝的属性“捕获”

Pig 使用自定义行/记录分隔符存储文件

BigQuery 命令“bq mk”引发错误“mk 操作中的 BigQuery 错误:读取架构时出错:”

bigquery 存储 api 在创建读取会话时挂起

如何从 BigQuery 作为流读取

从表中读取 BigQuery 数值数据类型