BigQuery JSON 查询
1. 核心场景:BigQuery JSON 数据提取与清洗
Section titled “1. 核心场景:BigQuery JSON 数据提取与清洗”在 BigQuery 中,使用原生 JSON 数据类型可以极大地提升半结构化数据的解析灵活性。以下是核心查询场景实战。
1.1. 提取 JSON 内部的简单对象或标量值
Section titled “1.1. 提取 JSON 内部的简单对象或标量值”通过 JSON_VALUE (返回 STRING) 或直接的点号路径提取:
SELECT sentAt, -- 直接提取内部的标量字段(注意:直接提取可能带有双引号) context.event_time_utc8FROM `truemetrics-admin.yangxy_test.json_data_json`LIMIT 10;1.2. 提取 JSON 内部的特定数组元素
Section titled “1.2. 提取 JSON 内部的特定数组元素”提取数组中指定索引的值,并进行 强类型转换(由于 JSON 解析默认返回字符串):
SELECT -- 提取 JSON 中 properties 对象下的 bookings 数组的第一个元素的金额 JSON_VALUE(properties, '$.bookings[0].booking_gmv.amount') AS amount_strFROM `truemetrics-admin.yangxy_test.json_data_json`ORDER BY -- 必须进行 SAFE_CAST 转换后才能进行数值大小排序 SAFE_CAST(JSON_VALUE(properties, '$.bookings[0].booking_gmv.amount') AS NUMERIC) DESC;1.3. 高阶实战:提取并完全拍平 (Flatten) JSON 数组
Section titled “1.3. 高阶实战:提取并完全拍平 (Flatten) JSON 数组”当 JSON 字段中包含一个对象数组(如一个订单中包含多个商品),我们需要将其展开,使每个商品独立成为一行,且保留原订单的上下文。
核心逻辑:结合 JSON_QUERY_ARRAY 将 JSON 数组转化为 BQ 原生数组,再利用 UNNEST 和 LEFT JOIN 进行展开。
SELECT messageId, -- 提取基础字段 JSON_VALUE(properties, '$.order_no') AS order_no, -- 提取拍平后每个子对象内部的具体字段 JSON_VALUE(booking, '$.booking_gmv.amount') AS booking_gmv_amountFROM `truemetrics-admin.yangxy_test.json_data_json`LEFT JOIN -- 将 JSON 中的 bookings 数组转换为原生 ARRAY <JSON> 并展开为多行 UNNEST(JSON_QUERY_ARRAY(properties, '$.bookings')) AS bookingON 1=1;