PySpark中greatest函数的逆函数:多列最小值获取方法咨询
PySpark中获取多列最小值的方法
嘿,你问的这个问题刚好有明确的答案:pyspark.sql.functions里的greatest()确实有对应的逆函数——就是least()!它的作用和greatest()完全对应:前者取多列的最大值,后者直接返回多列中的最小值。
举个实际的例子来演示怎么用:
from pyspark.sql import SparkSession import pyspark.sql.functions as F # 初始化SparkSession并创建测试DataFrame spark = SparkSession.builder.appName("min_columns_example").getOrCreate() sample_data = [(3, 1, 4), (5, 2, 6), (None, 7, 0)] df = spark.createDataFrame(sample_data, ["a", "b", "c"]) # 使用least()获取三列的最小值 df.withColumn("min_val", F.least("a", "b", "c")).show()
运行后输出会是:
+----+---+---+-------+ | a| b| c|min_val| +----+---+---+-------+ | 3| 1| 4| 1| | 5| 2| 6| 2| |null| 7| 0| null| +----+---+---+-------+
这里要注意,和greatest()一样,least()只要传入的列里有null,结果就会返回null。如果需要忽略null,可以结合coalesce先处理空值,或者用下面要说的另一种方法。
要是你因为某些原因不想用least()(比如旧版本兼容性?不过least()在PySpark 2.0+就支持了),除了写UDF之外,还有个灵活的替代方案:把目标列打包成数组,再用array_min()函数取数组里的最小值。
还是用上面的例子,这种方法的代码是:
df.withColumn("min_val", F.array_min(F.array("a", "b", "c"))).show()
这个方法的优势是更容易处理null场景,比如我们想忽略空值只计算非空列的最小值,可以这么写:
df.withColumn("filtered_array", F.array_except(F.array("a", "b", "c"), F.array(F.lit(None)))) .withColumn("min_val", F.when(F.size("filtered_array") > 0, F.array_min("filtered_array")).otherwise(None)) .show()
这样就能得到忽略null后的最小值了。
总结一下两种核心方法:
- 优先用
least(),它是greatest()的官方逆函数,用法简洁直接; - 数组+
array_min()的方式,灵活性更强,适合需要自定义处理空值或复杂列组合的场景。
内容的提问来源于stack exchange,提问作者Anneso
相关产品推荐
相关产品推荐

