如何将DataFrame字符串列拆分并过滤为指定整数数组?
处理DataFrame字符串列生成指定整数数组列
针对需求,这里给出基于Spark Scala的实现方案,完全匹配你列出的四条规则:
核心步骤
- 把逗号分隔的原始字符串拆分成字符串数组
- 清洗每个元素:按
:或=分割后取第一部分,保留数字前缀 - 筛选元素:仅保留以
2开头且不等于20的内容,转成整数类型 - 空数组兜底:如果处理后数组为空,替换为默认值
[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)
输出结果
| stringColumn | arrayColumn |
|---|---|
| 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
相关产品推荐
相关产品推荐

