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

如何将DataFrame字符串列拆分并过滤为指定整数数组?

处理DataFrame字符串列生成指定整数数组列

针对需求,这里给出基于Spark Scala的实现方案,完全匹配你列出的四条规则:

核心步骤

  1. 把逗号分隔的原始字符串拆分成字符串数组
  2. 清洗每个元素:按:或=分割后取第一部分,保留数字前缀
  3. 筛选元素:仅保留以2开头且不等于20的内容,转成整数类型
  4. 空数组兜底:如果处理后数组为空,替换为默认值[199]

代码实现

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.IntegerType

// 构造测试数据
val testDF = spark.createDataFrame(Seq(
  ("2000,2001,2002:a,2003=b,2004,100,101,500,20"),
  ("101,102,20")
)).toDF("stringColumn")

val resultDF = testDF.withColumn("arrayColumn",
  when(
    size(
      filter(
        transform(
          split(col("stringColumn"), ","),
          elem => split(elem, "[=:]")(0) // 拆分带后缀的元素,取前缀
        ),
        elem => elem.startsWith("2") && elem != "20" // 过滤规则
      ).cast(ArrayType(IntegerType)) // 转整数数组
    ) === 0,
    array(lit(199).cast(IntegerType)) // 空数组时填充默认值
  ).otherwise(
    filter(
      transform(
        split(col("stringColumn"), ","),
        elem => split(elem, "[=:]")(0)
      ),
      elem => elem.startsWith("2") && elem != "20"
    ).cast(ArrayType(IntegerType))
  )
)

resultDF.show(false)

输出结果

stringColumnarrayColumn
2000,2001,2002:a,2003=b,2004,100,101,500,20[2000, 2001, 2002, 2003, 2004]
101,102,20[199]

代码细节说明

  • split(col("stringColumn"), ","):将原始字符串按逗号拆分为数组
  • transform(..., elem => split(elem, "[=:]")(0)):用正则匹配=或:,拆分带后缀的元素并保留前缀
  • filter(..., elem => elem.startsWith("2") && elem != "20"):精准筛选符合要求的元素
  • cast(ArrayType(IntegerType)):将字符串数组转换为整数数组
  • when(size(...) === 0, array(lit(199)...)):判断数组为空时替换为默认值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:32:23