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

