【问题标题】:Is there an elegant way to turn a BQ nested field in to a key:value JSON?有没有一种优雅的方法可以将 BQ 嵌套字段转换为 key:value JSON?
【发布时间】:2021-01-23 19:34:56
【问题描述】:

我希望将 event_params 嵌套 BQ 字段转换为 JSON 字段的选项?

我想要的输出应该是这样的:

{"sessionId":123456789,"version":"1.005"}

【问题讨论】:

    标签: json google-bigquery


    【解决方案1】:

    考虑下面

    select *, (
      select '{' || string_agg(format('%s:%s',
        json_extract(kv, '$.key'),
        json_extract(kv, '$.string_value')
      )) || '}'
      from unnest(json_extract_array(to_json_string(event_params))) kv
    ) json
    from `project.dataset.table`    
    

    如果应用于您问题中的样本数据 - 输出是

    更新:我意识到您更改/修复了数据样本 - 请参阅下面的更新查询

    select *, (
      select '{' || string_agg(format('%s:%s',
        json_extract(kv, '$.key'),
        json_extract(kv, '$.value.string_value')
      )) || '}'
      from unnest(json_extract_array(to_json_string(event_params))) kv
    ) json
    from `project.dataset.table`
    

    有输出

    【讨论】:

      【解决方案2】:

      我制作了一个版本,您可以在其中以适当的格式在 JSON 对象中定义数字字段,并且您可以过滤某些键以最终出现在 JSON 对象中:

      with t as (
          -- fake example data with same format
          select * from unnest([
              struct([
                  struct('session_id' as key, struct('123' as string_value) as value), 
                        ('timestamp', struct('1234567')), 
                        ('version', struct('2.23.65'))
                      ] as event_params)
              ,struct([struct('session_id',struct('645')),('timestamp',struct('7653365')),('version',struct('3.675.34'))])
          ])
          
      )
      
      -- actual query
      select 
         event_params,      -- original data for comparison
         format('{ %s }',   -- for each row create one json object:
          (select           -- string_agg will return one string with all key-value pairs comma-separated
               string_agg(  -- within aggregation create key-value pairs
                   if(key in ('timestamp','session_id'),            -- if number fields 
                      format('"%s" : %s',key,value.string_value),   -- then number format
                      format('"%s" : "%s"',key,value.string_value)) -- else string format
                   , ', ')
           from unnest(event_params)   -- unnest turns array into a little table per row, so we can run SQL on it
           where key in ('session_id','version')   -- filter for certain keys
          )   -- subquery end
         ) as json
      from t
      

      【讨论】:

      • 太棒了!非常感谢你,马丁!
      猜你喜欢
      • 2021-12-19
      • 2019-07-11
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      相关资源
      最近更新 更多