从 BigQuery 数据 JSON 中的数组中提取索引值
Posted
技术标签:
【中文标题】从 BigQuery 数据 JSON 中的数组中提取索引值【英文标题】:Extract index values from array in BiQuery data JSON 【发布时间】:2020-02-26 10:37:23 【问题描述】:我已将数据从 Firestore 导入 BigQuery。我的数据结构是这样的:
data = [
id: "item1",
status:
options: [
title: "Approved",
color: "#00ff00"
,
title: "Rejected",
color: "#ff0000"
,
title: "Pending",
color: "#ffaa00"
],
optionIndex: 0
,
id: "item2",
status:
options: [
title: "Validated",
color: "#00ff00"
,
title: "Invalidated",
color: "#ff0000"
],
optionIndex: 1
];
我成功运行了一个查询,提取了id等键值:
SELECT
JSON_EXTRACT(data, '$.id') AS item_id,
JSON_EXTRACT(data, '$.status.optionIndex') AS option_index
FROM `my_bigquery_table`
但是,我很难找到选择 status.options[status.options.optionIndex] 的解决方案,我可以在其中将状态的标题和颜色放入表格中。我一直追求的结果是:
id,status_title,status_color
item1,Approved,#00ff00
item2,Invalidated,#ffaa00
(我对包括连接在内的大多数基本 SQL 都做得很好,但是将状态数组放入可查询的结构中,我可以在其中选择索引并没有在我的级别内)
【问题讨论】:
我对结构化数据和 JSON 遍历的混合感到非常困惑 - 你的表的架构是什么? 对不起。 JSON 数据结构是 Firestore 导入器创建的表中的“数据”列。 IE。这就是 Firestore 中文档的结构方式,并将此内容结构复制到导入表中的数据列。我对 BigQuery 还很陌生,但我知道这很正常。但它确实使 SQL 查询非常糟糕,我必须查询该 JSON 字符串。我可能遗漏了什么? 【参考方案1】:以下是 BigQuery 标准 SQL
#standardSQL
CREATE TEMP FUNCTION json2array(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS '''
return JSON.parse(input).map(x=>JSON.stringify(x));
''';
SELECT
JSON_EXTRACT_SCALAR(data, '$.id') AS id,
JSON_EXTRACT_SCALAR(option, '$.title') AS status_title,
JSON_EXTRACT_SCALAR(option, '$.color') AS status_color
FROM `project.dataset.my_bigquery_table`,
UNNEST([json2array(JSON_EXTRACT(data, '$.status.options'))[OFFSET(CAST(JSON_EXTRACT_SCALAR(data, '$.status.optionIndex') AS INT64))]]) option
如果应用于您问题中的样本数据 - 输出是
Row id status_title status_color
1 item1 Approved #00ff00
2 item2 Invalidated #ff0000
【讨论】:
以上是关于从 BigQuery 数据 JSON 中的数组中提取索引值的主要内容,如果未能解决你的问题,请参考以下文章
从 Google Ads BigQuery 数据传输中提取/取消嵌套数组