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

Apache Spark中按age去重并合并DataFrame非空值的实现问询

解决Spark DataFrame按指定列去重并合并非空值的问题

没问题,这个需求在Spark里用分组聚合就能轻松搞定,核心思路是按目标列(这里是age)分组后,对每个字段提取非空的有效值。针对你的示例数据,具体实现如下:

Python 版本实现

首先导入Spark SQL函数库,然后通过groupBy按age分组,再用first(ignorenulls=True)对每个列取第一个非空值(因为同个age下每个列的非空值不会冲突,正好符合合并需求):

from pyspark.sql import functions as F

# 假设你的DataFrame名为df
result_df = df.groupBy("age") \
    .agg(
        F.first(F.col("children"), ignorenulls=True).alias("children"),
        F.first(F.col("education"), ignorenulls=True).alias("education"),
        F.first(F.col("income"), ignorenulls=True).alias("income")
    ) \
    .orderBy("age")  # 按age排序,和示例输出一致

result_df.show()

Scala 版本实现

同样的逻辑,用Scala代码实现:

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

// 假设你的DataFrame名为df
val resultDf = df.groupBy("age")
    .agg(
        first(col("children"), ignoreNulls = true).alias("children"),
        first(col("education"), ignoreNulls = true).alias("education"),
        first(col("income"), ignoreNulls = true).alias("income")
    )
    .orderBy("age")

resultDf.show()

补充说明

  • 这里用first(ignorenulls=True)的原因是:它会跳过null值,直接取分组内该列的第一个非空值,完全匹配你示例中合并非空值的需求。
  • 如果你的业务场景中,同一个分组下某列存在多个非空值,你可以根据需求替换聚合函数:比如用collect_list收集所有非空值,或者用max/min取极值,具体取决于业务规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:20:32