如何从Spark DataFrame的数组列中提取各数组的最小值?
提取Spark DataFrame数组列的最小值
没问题,我来帮你搞定这个需求。你的数组里包含空字符串(比如第一个元素是空值),直接求最小值会出问题,得先清理这些无效值再计算。这里有个可以直接运行的解决方案:
import org.apache.spark.sql.functions.{array_min, transform, col, trim} // 处理数组并提取最小值 val resultDF = DF .withColumn("complete1", array_min(transform(col("complete1"), x => trim(x).cast("int")).filter(_.isNotNull)) ) .withColumn("complete2", array_min(transform(col("complete2"), x => trim(x).cast("int")).filter(_.isNotNull)) )
分步拆解逻辑:
- 清理+类型转换:用
transform遍历数组每个元素,先通过trim()去除可能的空格(虽然你的例子里是空字符串,但这个操作更通用),再把元素转成整数类型——空字符串转整数会得到null。 - 过滤无效值:用
filter(_.isNotNull)把转换后产生的null过滤掉,只保留有效的数字元素。 - 计算最小值:用
array_min()对处理后的数组求最小值,这个函数会正确返回数组中的最小整数。
运行这段代码后,你会得到完全符合预期的结果:
|id |complete1|complete2|
+---+---------+---------+
|123|1 |3 |
|124|2 |3 |
补充:处理全空数组的特殊情况
如果你的数据里存在某个数组全是空字符串的情况,处理后会变成空数组,array_min()会返回null。如果需要给这种情况设置默认值,可以用coalesce()调整,比如:
coalesce(array_min(...), lit(0)) // 把null替换成0,你可以改成自己需要的默认值
内容的提问来源于stack exchange,提问作者nickfrenchy
相关产品推荐
相关产品推荐

