Databricks中如何拆分Deck_Info并将范围展开为多行(含多分隔符)?
Databricks SQL 实现Deck_Info字段多场景拆分
以下是针对需求优化后的SQL查询,可同时处理多分隔符拆分和范围展开:
WITH processed_data AS ( -- 统一范围标识:将TO/to、数字间的短横线替换为~,避免与非范围短横线混淆 SELECT id, regexp_replace( regexp_replace(Deck_Info, '\\s*(TO|to)\\s*', '~'), '(?<=\\d)-(?!\\d)', '~' ) AS normalized_info FROM raw_data ), split_units AS ( -- 按所有非范围分隔符拆分出独立单元 SELECT id, explode( split( normalized_info, '\\s*(,|&|/|\\+|\\.)\\s*' -- 匹配带可选空格的目标分隔符 ) ) AS unit FROM processed_data ), expand_ranges AS ( -- 展开范围单元,普通单元直接保留 SELECT id, CASE WHEN unit LIKE '%~%' THEN explode( sequence( cast(split(unit, '~')[0] AS INT), cast(split(unit, '~')[1] AS INT) ) ) ELSE cast(unit AS INT) -- 假设字段值为数字,若含字符串需调整类型 END AS deck_value FROM split_units ) SELECT id, deck_value FROM expand_ranges
关键逻辑说明:
- 统一范围标识:先将
TO/to和数字间的短横线替换为~,避免误处理产品型号等场景中的非范围短横线。 - 拆分独立单元:通过
split函数按,、&、/、+、.(支持前后带空格)拆分出单个值或范围表达式。 - 展开范围值:利用
sequence生成区间内的所有整数,再通过explode将范围展开为多行;非范围单元直接转换为对应类型输出。
注意事项:
- 若Deck_Info包含非数字的范围或值,需调整
cast的类型,字符串范围需额外编写逻辑处理。 - 若存在数字与字符串混合的场景,需添加判断逻辑区分处理不同类型的单元。
内容的提问来源于stack exchange,提问作者Mansi Goel
相关产品推荐
相关产品推荐

