Arrays BigQuery:从json对象中提取键,将json从对象转换为键值数组

Arrays BigQuery:从json对象中提取键,将json从对象转换为键值数组,arrays,json,google-bigquery,Arrays,Json,Google Bigquery,我有一个包含json对象的列的表,值类型始终是字符串 我需要两种信息: json键的列表 在键值对数组中转换json 这就是我到目前为止得到的结果,它正在发挥作用: CREATE TEMP FUNCTION jsonObjectKeys(input STRING) RETURNS Array<String> LANGUAGE js AS """ return Object.keys(JSON.parse(input)); ""&q

我有一个包含json对象的列的表,值类型始终是字符串

我需要两种信息:

json键的列表 在键值对数组中转换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

问题是函数在计算优化方面不是最好的,所以我试图了解是否有一种方法可以使用普通SQL来实现这两个需求,或者至少其中一个需求可以使用SQL w/o函数来实现。

下面是针对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    
如果要应用于问题中的样本数据,则输出为


你试过了吗?这对你有用吗?是的,它工作得很好,谢谢你-我很惊讶BQ没有这个实用功能