在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
相关产品推荐
相关产品推荐

