使用 BigQuery 读取 JSON 结构时重复数据

Posted

技术标签:

【中文标题】使用 BigQuery 读取 JSON 结构时重复数据【英文标题】:Duplicating data when reading JSON structure using BigQuery 【发布时间】:2020-03-25 21:23:17 【问题描述】:

我看到数据重复或丢失了序列广告,为我拥有的 JSON 结构创建了无效数据。

示例输入数据:有两列 job_id 和 "conv_column",具有以下 JSON 结构。

[ “来源”: ””, “数字”:“WP1”, “名称”:“井#1”, "树液编号": "", “状态”: ””, “国家”: ””, “场地”: ””, “乌维”:“”, “环境”: ””, “井号”:“WP1”, "纬度": "", "经度": "", “类型”: ””, "水深": "", "井几何": "", "钻取": "", “县”:“”, “城市”: ””, "WellPlaceholderId": "dd726299-26c3-447d-8367-ef1ec79d1c28", “IsNonMasteredWell”:是的 , “来源”: ””, “数字”:“WP2”, “名称”:“井#2”, "树液编号": "", “状态”: ””, “国家”: ””, “场地”: ””, “乌维”:“”, “环境”: ””, “井号”:“WP2”, "纬度": "", "经度": "", “类型”: ””, "水深": "", "井几何": "", "钻取": "", “县”:“”, “城市”: ””, "WellPlaceholderId": "129808ad-6f07-46f3-ab70-4140e4cc92ff", “IsNonMasteredWell”:是的 , “来源”: ””, “数字”:“1-6HQPMA”, “名称”:“BLANCA-004”, "树液编号": "", “状态”: ””, “国家”:“厄瓜多尔”, “领域”:“布兰卡”, “Uwi”:“BLC-004”, “环境”:“土地”, “井号”:“0064004151”, “纬度”:“0.311318889”, “经度”:“-76.17652111”, “类型”:“发展”, "水深": "", "WellGeometry": "垂直 (0 -

输出:

我正在使用的代码:

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://dev-workspace/json_temp/jsonpath-0.8.0.js"
);
SELECT distinct job_id,well_id,
 well_name,well_number,well_sap_number,well_field,well_uwi
from lz_fdp_op.dbm_temp_data 
left join UNNEST(CUSTOM_JSON_EXTRACT(conv_column,"$.Operation.Wells[*].WellId")) Well_ID
left join UNNEST(CUSTOM_JSON_EXTRACT(conv_column,"$.Operation.Wells[*].Name")) well_name
left join UNNEST(CUSTOM_JSON_EXTRACT(conv_column,"$.Operation.Wells[*].Number")) well_number
left join UNNEST(CUSTOM_JSON_EXTRACT(conv_column,"$.Operation.Wells[*].SapNumber")) well_sap_number
left join UNNEST(CUSTOM_JSON_EXTRACT(conv_column,"$.Operation.Wells[*].Field")) well_field
left join UNNEST(CUSTOM_JSON_EXTRACT(conv_column,"$.Operation.Wells[*].Uwi")) well_uwi

【问题讨论】:

【参考方案1】:

我之前使用过@Mikhail Berlyant 建议的功能,我有解决方案。

CREATE TEMP FUNCTION jsonparse(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
  return JSON.parse(input).map(x=>JSON.stringify(x));
"""; 
SELECT job_id,
  JSON_EXTRACT_SCALAR(wells, '$.WellId') AS Well_id,
  JSON_EXTRACT_SCALAR(wells, '$.Name') AS Well_Name
FROM temp_db.dbm_temp_data ,
UNNEST(jsonparse(JSON_EXTRACT(conv_column, '$.Operation.Wells'))) wells

【讨论】:

以上是关于使用 BigQuery 读取 JSON 结构时重复数据的主要内容,如果未能解决你的问题,请参考以下文章

代码在读取 JSON 时返回错误,并且 BigQuery SQL 的 JSON 结构中不存在引用的部分

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

使用 UI 将 JSON 加载到 Bigquery 时出错

如何使用 JSON_EXTRACT 或 JSON_EXTRACT_SCALAR 在 Big Query 中读取多级 JSON 数据

用于读取 JSON 格式数据的 BigQuery 表 URL

使用 Java 从 BigQuery 到 BigQuery 表的表复制中的 JSON 解析错误