如何将BigQuery中重复记录event_params的键值转换为对应列?
解决方案
你要实现的是嵌套重复字段的行转列操作,针对event_params结构有两种常用实现方式,都不会产生多余的拆分行:
方案1:子查询直接取值(适合提取的参数key较少的场景)
这种写法不需要全局拆行,子查询内的UNNEST仅针对当前行的event_params数组匹配取值,性能更优:
SELECT -- 可自行补充需要保留的原表字段,例如 event_name、event_timestamp、user_pseudo_id 等 (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'firebase_event_origin') AS firebase_event_origin, (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'engagement_time_msec') AS engagement_time_msec, (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'firebase_screen') AS firebase_screen FROM `你的项目ID.你的数据集.你的表名`
你可以根据参数的实际类型,切换取value.string_value/value.int_value/value.float_value/value.double_value字段。
方案2:PIVOT语法(适合需要提取大量参数key的场景)
如果需要转换的参数数量较多,可以用PIVOT语法简化代码:
SELECT * FROM ( SELECT -- 先列出所有需要保留的原表非嵌套字段 event_name, event_timestamp, user_pseudo_id, ep.key, -- 统一取出参数值,不同类型做兼容处理 COALESCE( ep.value.string_value, CAST(ep.value.int_value AS STRING), CAST(ep.value.float_value AS STRING), CAST(ep.value.double_value AS STRING) ) AS param_value FROM `你的项目ID.你的数据集.你的表名`, UNNEST(event_params) ep -- 可过滤仅需要转换的key,减少计算量 WHERE ep.key IN ('firebase_event_origin','engagement_time_msec','firebase_screen') ) PIVOT ( MAX(param_value) FOR key IN ('firebase_event_origin','engagement_time_msec','firebase_screen') )
如果需要保留数值类型的参数值,可在查询结果中对对应列单独做CAST类型转换即可。
参考截图


内容的提问来源于stack exchange,提问作者noa b
相关产品推荐
相关产品推荐

