【问题标题】:BigQuery: extract keys from json object, convert json from object to key-value arrayBigQuery:从 json 对象中提取键,将 json 从对象转换为键值数组
【发布时间】:2021-03-10 22:05:46
【问题描述】:

我有一个包含 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

问题是FUNCTION 在计算优化方面并不是最好的,所以我试图了解是否有一种方法可以使用普通 SQL 来满足这两个需求(或至少其中一个)只有 SQL 没有函数。

【问题讨论】:

    标签: arrays json google-bigquery


    【解决方案1】:

    以下是 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 没有为此提供实用功能
    • 如果键/值包含冒号和/或值是字符串数组(即包含" 字符),此函数会失败吗?
    • 当然,如果您有这样的极端情况并需要帮助 - 发布您的问题,我们会提供帮助
    • @MikhailBerlyant 我正在尝试对此进行解码,但正在苦苦挣扎。在线array(select trim(split(kv, ':')[offset(0)]) from t.kv kv) as keys t.kv kv 是什么意思?是 t = 数据集,kv = 列吗?
    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 2016-03-18
    • 2014-05-26
    • 1970-01-01
    • 2022-11-01
    • 2019-05-01
    • 2019-02-05
    • 2016-12-24
    相关资源
    最近更新 更多