我想在Spark程序中遍历数据框的列并计算最小值和最大值。 我是Spark和scala的新手,一旦我在数据框中获取它就无法迭代列。
我已经尝试运行下面的代码,但它需要传递给它的列号,问题是如何从数据帧中获取它并动态传递它并将结果存储在集合中。
val parquetRDD = spark.read.parquet("filename.parquet")
parquetRDD.collect.foreach ({ i => parquetRDD_subset.agg(max(parquetRDD(parquetRDD.columns(2))), min(parquetRDD(parquetRDD.columns(2)))).show()})
感谢您的任何帮助。
答案 0 :(得分:3)
您不应该在行或记录上进行迭代。您应该使用聚合函数
import org.apache.spark.sql.functions._
val df = spark.read.parquet("filename.parquet")
val aggCol = col(df.columns(2))
df.agg(min(aggCol), max(aggCol)).show()
首先,当你执行spark.read.parquet时,你正在读取一个数据帧。 接下来,我们使用col函数定义我们想要处理的列。 col函数将列名转换为列。您可以使用df(“name”),其中name是列的名称。
agg函数采用聚合列,因此min和max是聚合函数,它采用列并返回具有聚合值的列。
<强>更新强>
根据评论,目标是为所有列提供最小值和最大值。因此,您可以这样做:
val minColumns = df.columns.map(name => min(col(name)))
val maxColumns = df.columns.map(name => max(col(name)))
val allMinMax = minColumns ++ maxColumns
df.agg(allMinMax.head, allMinMax.tail: _*).show()
您也可以这样做:
df.describe().show()
为您提供所有列的统计信息,包括min,max,avg,count和stddev