在 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_id
和 json_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_id
s 工作正常。
你认为它的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 输入意外结束的主要内容,如果未能解决你的问题,请参考以下文章