【问题标题】:BigQuery Convert Columns to RECORDBigQuery 将列转换为 RECORD
【发布时间】:2021-06-07 10:11:12
【问题描述】:

在 BigQuery 中,如何将许多列转换为 RECORD 或键值对数组 例如

源表

id Name DOB Sex
1 Fred 01.01.2001 M

目标表

Id Name Key Value
1 Fred DOB 01.01.2001
Sex M

我尝试了一些方法,但无法到达那里,有什么好的方法吗?

【问题讨论】:

    标签: arrays google-bigquery record


    【解决方案1】:

    我已经尝试了一些方法,但无法到达那里,有什么好的方法吗?

    不确定究竟是什么/可能是一个问题,因为它就像下面一样简单/直截了当

    select id, Name,
      [struct<key string, value string>('DOB', DOB),('Sex', Sex)] info
    from `project.dataset.table`
    

    有输出

    同时,当您事先不知道这些列名并希望采用通用方法时,通常会出现问题 - 在这种情况下,您可以使用以下方法,其中列名 DOBSex 没有被使用

    select id, Name,
      array(
        select as struct
          split(replace(kv, '"', ''),':')[offset(0)] key, 
          split(replace(kv, '"', ''),':')[offset(1)] value, 
        from unnest(split(trim(to_json_string((select as struct * except (id, name) from unnest([t]))), '{}'))) kv
      ) info
    from `project.dataset.table` t
    

    具有完全相同的结果/输出

    【讨论】:

      【解决方案2】:

      这里有一个解决方案:-

      WITH `proj.dataset.tbl` AS
      (SELECT '1' AS id, 'Fred' AS Name, '2020-12-07' AS DOB, 'M' as Sex
      )
      SELECT id, Name,
              [struct('DOB' as key, cast (DOB as string) as value ),
              struct('Sex' as key, Sex as value)
             ] as key_values
      
      FROM `proj.dataset.tbl` 
      

      输出将是:-

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多