Spark SQL如何仅通过查询实现按字符串分隔符拆分数据行?
Spark SQL拆分逗号分隔字符串为多行(无递归CTE/Cross Apply)
Spark SQL原生提供了split和explode函数,完全可以替代递归CTE或Cross Apply实现逗号分隔字符串拆分行的需求,不需要依赖高级SQL特性。
基础实现
假设你有一张表target_table,包含需要保留的字段(比如id、info)和要拆分的逗号分隔字段tags,核心查询语句如下:
SELECT id, info, -- 拆分字符串为数组后,将每个元素转为单独一行 explode(split(tags, ',')) AS tag FROM target_table
处理特殊场景
1. 去除拆分后元素的前后空格
如果原字符串包含带空格的元素(比如"java, python, sql"),拆分后会得到带空格的结果,用trim处理即可:
SELECT id, info, trim(explode(split(tags, ','))) AS tag FROM target_table
2. 过滤空字符串元素
如果原字符串存在连续逗号或首尾逗号(比如"java,,sql,"),拆分后会生成空字符串,可通过子查询过滤:
SELECT id, info, tag FROM ( SELECT id, info, trim(explode(split(tags, ','))) AS tag FROM target_table ) tmp WHERE tag != ''
3. 保留原表的空值行
如果原字段tags为null,explode会直接跳过该行;若需要保留原行(拆分后字段为null),改用explode_outer:
SELECT id, info, trim(explode_outer(split(tags, ','))) AS tag FROM target_table
示例效果
假设原表数据:
| id | info | tags |
|---|---|---|
| 1 | 项目A | java,python |
| 2 | 项目B | sql,,scala |
| 3 | 项目C | null |
使用带过滤的查询后,结果为:
| id | info | tag |
|---|---|---|
| 1 | 项目A | java |
| 1 | 项目A | python |
| 2 | 项目B | sql |
| 2 | 项目B | scala |
| 3 | 项目C | null |
内容的提问来源于stack exchange,提问作者key
相关产品推荐
相关产品推荐

