Dev*_*ter 3 arrays json google-bigquery
我有一个表,其中有一列包含 json 对象,值类型始终是字符串。
我需要两种信息:
这是我到目前为止所得到的,正在发挥作用:
CREATE TEMP FUNCTION jsonObjectKeys(input STRING)
RETURNS Array<String>
LANGUAGE js AS """
return Object.keys(JSON.parse(input));
""";
CREATE TEMP FUNCTION jsonToKeyValueArray(input STRING)
RETURNS Array<Struct<key String, value String>>
LANGUAGE js AS """
let json = JSON.parse(input);
return Object.keys(json).map(e => {
return { "key" : e, "value" : json[e] }
});
""";
WITH input AS (
SELECT "{\"key1\": \"value1\", \"key2\": \"value2\"}" AS json_column
UNION ALL
SELECT "{\"key1\": \"value1\", \"key3\": \"value3\"}" AS json_column
UNION ALL
SELECT "{\"key5\": \"value5\"}" AS json_column
)
SELECT
json_column,
jsonObjectKeys(json_column) AS keys,
jsonToKeyValueArray(json_column) AS key_value
FROM input
Run Code Online (Sandbox Code Playgroud)
问题是这FUNCTION在计算优化方面并不是最好的,所以我试图了解是否有一种方法可以使用纯 SQL 来实现这 2 个需求(或至少其中 1 个),而无需使用 SQL 函数。
以下是 BigQuery 标准 SQL
#standardsql
select
json_column,
array(select trim(split(kv, ':')[offset(0)]) from t.kv kv) as keys,
array(
select as struct
trim(split(kv, ':')[offset(0)]) as key,
trim(split(kv, ':')[offset(1)]) as value
from t.kv kv
) as key_value
from input,
unnest([struct(split(translate(json_column, '{}"', '')) as kv)]) t
Run Code Online (Sandbox Code Playgroud)
如果适用于您的问题中的样本数据 - 输出是
| 归档时间: |
|
| 查看次数: |
4650 次 |
| 最近记录: |