You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

示例效果

假设原表数据:

idinfotags
1项目Ajava,python
2项目Bsql,,scala
3项目Cnull

使用带过滤的查询后,结果为:

idinfotag
1项目Ajava
1项目Apython
2项目Bsql
2项目Bscala
3项目Cnull

内容的提问来源于stack exchange,提问作者key

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:35:05