迭代spark数据帧中的列并计算最小值

时间:2017-07-18 16:02:06

标签: scala apache-spark apache-spark-sql spark-streaming spark-dataframe

我想在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()})

感谢您的任何帮助。

1 个答案:

答案 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