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

Spark Java实现:获取DataFrame各列名称及对应最大长度

Java Spark 获取DataFrame列名与对应列最长元素长度

方法一:生成包含各列最大长度的宽表

一次性聚合所有列的最长元素长度,得到一行多列的结果(列名格式为原列名_max_length):

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import static org.apache.spark.sql.functions.*;
import java.util.Arrays;
import java.util.stream.Collectors;

// 生成所有列的max(length)聚合表达式,别名设为原列名+_max_length
var aggExpressions = Arrays.stream(df.columns())
        .map(colName -> max(length(col(colName))).alias(colName + "_max_length"))
        .collect(Collectors.toList());

// 执行聚合,得到结果DataFrame
Dataset<Row> maxLengthWideDf = df.agg(aggExpressions.get(0), 
                                      aggExpressions.subList(1, aggExpressions.size()).toArray(new org.apache.spark.sql.Column[0]));

// 查看结果
maxLengthWideDf.show();

方法二:生成列名与长度对应的长表

如果需要column_name和max_length两列的格式,可将上述宽表转换为长表:

// 将宽表转换为长表,每行对应一个列的信息
String unionSql = Arrays.stream(df.columns())
        .map(colName -> String.format("'%s' as column_name, `%s_max_length` as max_length", colName, colName))
        .collect(Collectors.joining(" union all select "));

Dataset<Row> maxLengthLongDf = maxLengthWideDf.selectExpr(unionSql);
maxLengthLongDf.show();

注意事项

  • 如果列是数值类型,length()会将数值转为字符串后计算长度(比如数值123的长度为3);若仅需处理字符串列,可先过滤列类型:
    var stringCols = Arrays.stream(df.schema().fields())
            .filter(field -> field.dataType().simpleString().equals("string"))
            .map(field -> field.name())
            .toArray(String[]::new);
    
    后续用stringCols替代df.columns()即可。
  • 你之前的代码问题在于逐个列单独聚合,效率低且无法直接生成结构化的DataFrame,一次性聚合所有列是更优的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:02:23