如何替换BigQuery中嵌套重复字段hits.customdimensions.value并保留其他列?
问题:如何在BigQuery中哈希嵌套的
hits.customdimensions.value并保留其他字段? 我希望在保持其余数据不变的前提下,替换嵌套重复字段hits.customdimensions.value:对hits.customdimensions.index处于1至5之间的value用MD5哈希,并用哈希值替换原值。
处理非嵌套的customdimensions.value时,以下SQL语句可行:
select x.* except (customdimensions), cd.index as cdindex, MD5(cd.value) as cdvalue from `datasetx.tabley` x, unnest(customdimensions) as cd where cd.index between 1 and 5
但处理嵌套的hits.customdimensions.value时,使用except (hits)会导致其他列丢失,当前尝试的SQL语句如下:
select x.* except (hits), hitcd.index as hitcdindex, MD5(hitcd.value) as hitcdvalue from `datasetx.tabley` x, unnest(hits) as hit, unnest(hit.customdimensions) as hitcd where hitcd.index between 1 and 5
请问是否有简便的解决方案?
回答
这个问题我之前也踩过坑!你的核心问题是之前的写法把嵌套数组给扁平化了,还丢掉了原有的hits结构。正确的思路是原地修改嵌套数组里的特定元素,同时完整保留所有其他字段的结构和数据。
试试下面这个SQL:
SELECT * EXCEPT(hits), ARRAY( SELECT AS STRUCT hit.* EXCEPT(customdimensions), ARRAY( SELECT AS STRUCT cd.index, CASE WHEN cd.index BETWEEN 1 AND 5 THEN MD5(cd.value) ELSE cd.value END AS value FROM UNNEST(hit.customdimensions) cd ) AS customdimensions FROM UNNEST(hits) hit ) AS hits FROM `datasetx.tabley`
关键逻辑解释:
- 外层用
* EXCEPT(hits)保留原表所有非hits的字段,避免丢失数据 - 用
ARRAY(SELECT AS STRUCT ...)重新构建完整的hits数组,确保原有的嵌套结构不变 - 对每个
hit内部,同样用ARRAY(SELECT AS STRUCT ...)重构customdimensions数组:- 用
CASE判断index是否在1-5范围内,符合条件的就用MD5()哈希替换value,不符合的保留原值
- 用
- 整个查询执行后,表的结构和原表完全一致,只有目标字段被修改,不会丢失任何其他列
这种写法比你之前尝试的扁平化查询更贴合需求,因为它严格保留了原有的嵌套数据结构,不需要额外处理字段丢失的问题。
内容的提问来源于stack exchange,提问作者Mie
相关产品推荐
相关产品推荐

