【问题标题】:How to convert stringified array into array in BigQuery?如何将字符串化数组转换为 BigQuery 中的数组?
【发布时间】:2018-02-22 07:11:45
【问题描述】:

碰巧我在 BigQuery 的一个字段中有一个字符串化数组

'["a","b","c"]'

我想将其转换为 BigQuery 可以理解的数组。 我希望能够在标准 SQL 中做到这一点:

with k as (select '["a","b","c"]' as x)
select unnested_x from k, unnest(x) unnested_x

我已经尝试过JSON_EXTRACT('["a","b","c"]','$') 以及我可以在网上找到的所有其他内容。

有什么想法吗?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    WITH k AS (
      SELECT 1 AS id, '["a","b","c"]' AS x UNION ALL
      SELECT 2, '["x","y"]' 
    )
    SELECT 
      id, 
      ARRAY(SELECT * FROM UNNEST(SPLIT(SUBSTR(x, 2 , LENGTH(x) - 2)))) AS x
    FROM k
    

    它将您的字符串列转换为数组列

    【讨论】:

    • 这适用于一个简单的数组(OP 询问过),但不能处理更复杂的 json 取消嵌套。
    • @RyanTuck - 显然提供的答案是针对特定问题的!如果您需要更通用的解决方案 - 请使用相应的详细信息发布您的问题 - 我(或 SO 上的其他人)将很乐意为您提供帮助:o)
    • 绝对!我确实找到了一个使用 UDF 的更通用的解决方案,并在这里添加了我自己的答案:) - 你知道这是否可以在不使用 UDF 的情况下完成?
    • @RyanTuck - 对于给定问题的案例,我只是看不到更通用/更昂贵的解决方案的任何需求。如果您觉得您有确实需要的用例 - 发布您的问题,以便我们回答:o)
    • 我同意对于给定的问题,不需要更通用的解决方案。我在这里问了更一般的问题:stackoverflow.com/questions/57117805/…
    【解决方案2】:

    最近(2020 年)JSON_EXTRACT_ARRAY 函数被添加到 bigquery 标准 sql 中。

    无需 UDF 或技巧即可轻松获得预期行为

    with k as (select JSON_EXTRACT_ARRAY('["a","b","c"]', '$') as x)
    select unnested_x from k, unnest(x) unnested_x
    

    将导致:

    ╔══════════════╗
    ║ "unnested_x" ║
    ╠══════════════╣
    ║     "a"      ║
    ║     "b"      ║
    ║     "c"      ║
    ╚══════════════╝
    

    JSON_EXTRACT_ARRAY doc

    【讨论】:

      【解决方案3】:

      此解决方案更新了@northtree 的答案,并且更优雅地处理将数组成员作为字符串化 JSON 对象返回,而不是返回 [object Object] 字符串:

      CREATE TEMP FUNCTION
        JSON_EXTRACT_ARRAY(input STRING)
        RETURNS ARRAY<STRING>
        LANGUAGE js AS """  
      return JSON.parse(input).map(x => JSON.stringify(x));
      """;
      
      with
      
      raw as (
        select
          1 as id,
          '[{"a": 5, "b": 6}, {"a": 7}, 456]' as body
      )
      
      select
        id,
        entry,
        json_extract(entry, '$'),
        json_extract(entry, '$.a'),
        json_extract(entry, '$.b')
      from
        raw,
        unnest(json_extract_array(body)) as entry
      

      【讨论】:

        【解决方案4】:

        我想提供一个替代方案。由于数组是一个字符串,只需使用 regexp_extract_all 提取值:

        REGEXP_EXTRACT_ALL(your_string, r'[0-9a-zA-Z][^"]+') as arr
        

        您可能会发现正则表达式过于严格,无法以字母数字开头;你可以根据自己的喜好调整它。

        【讨论】:

          【解决方案5】:

          通过JS UDF 会容易得多。

          CREATE TEMP FUNCTION
            JSON_EXTRACT_ARRAY(input STRING)
            RETURNS ARRAY<STRING>
            LANGUAGE js AS """  
          return JSON.parse(input);
          """;
          WITH
            k AS (
            SELECT
              '["a","b","c"]' AS x)
          SELECT
            JSON_EXTRACT_ARRAY(x) AS x
          FROM
            k
          

          【讨论】:

            猜你喜欢
            • 2021-06-02
            • 1970-01-01
            • 2023-03-23
            • 2018-04-13
            • 2021-12-13
            • 1970-01-01
            • 2021-11-20
            • 1970-01-01
            • 2019-01-18
            相关资源
            最近更新 更多