使用 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 输入意外结束
如何使用 JSON_EXTRACT 或 JSON_EXTRACT_SCALAR 在 Big Query 中读取多级 JSON 数据