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

在Apache Spark(Java环境)中如何删除全为NULL值的列?

在Java Spark SQL中删除全为NULL的列

实现思路

要移除所有值均为NULL的列,核心逻辑是先识别出非全NULL的列,再保留这些列:

  • 对DataFrame的每一列,计算该列的非空值数量(count函数会自动忽略NULL值)
  • 筛选出非空值数量大于0的列
  • 用筛选后的列列表重新生成DataFrame

Java代码实现

假设你已经完成SparkSession的初始化,且已有输入DataFrame inputDF,以下是完整实现代码:

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.functions;
import org.apache.spark.sql.types.DataTypes;

import java.util.ArrayList;
import java.util.List;

public class DropAllNullColumns {
    public static void main(String[] args) {
        // 初始化SparkSession(生产环境可移除master配置)
        SparkSession spark = SparkSession.builder()
                .appName("DropAllNullColumns")
                .master("local[*]")
                .getOrCreate();

        // 构造示例输入DataFrame
        Dataset<Row> inputDF = spark.createDataFrame(
                List.of(
                        RowFactory.create("JUAN", 23, null, null),
                        RowFactory.create("JAVIER", null, null, null),
                        RowFactory.create("PABLO", 22, null, null),
                        RowFactory.create("SERGIO", null, null, null),
                        RowFactory.create("RODRIGO", null, null, null)
                ),
                DataTypes.createStructType(List.of(
                        DataTypes.createStructField("name", DataTypes.StringType, true),
                        DataTypes.createStructField("age", DataTypes.IntegerType, true),
                        DataTypes.createStructField("height", DataTypes.IntegerType, true),
                        DataTypes.createStructField("weight", DataTypes.IntegerType, true)
                ))
        );

        // 1. 统计每一列的非空值数量
        Dataset<Row> columnNullStats = inputDF.agg(
                inputDF.columns().stream()
                        .map(col -> functions.count(functions.col(col)).alias(col))
                        .toArray(org.apache.spark.sql.Column[]::new)
        );

        // 2. 筛选出需要保留的列(非空值数量>0)
        Row statsRow = columnNullStats.first();
        List<String> keepColumns = new ArrayList<>();
        for (String colName : inputDF.columns()) {
            long nonNullCount = statsRow.getLong(statsRow.fieldIndex(colName));
            if (nonNullCount > 0) {
                keepColumns.add(colName);
            }
        }

        // 3. 生成只保留目标列的结果DataFrame
        Dataset<Row> resultDF = inputDF.select(
                keepColumns.stream().map(functions::col).toArray(org.apache.spark.sql.Column[]::new)
        );

        // 打印结果
        resultDF.show();

        spark.stop();
    }
}

代码说明

  • 统计非空值数量:使用agg配合count函数,count(col)会自动忽略NULL值,返回该列的非空行数。若结果为0,说明该列所有值都是NULL。
  • 筛选保留列:从统计结果中提取非空行数大于0的列名,这些就是需要保留的列。
  • 生成结果DataFrame:调用select方法传入筛选后的列列表,得到最终的DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:07:06