Scala 遍历spark dataframe中的列并计算最小最大值

Scala 遍历spark dataframe中的列并计算最小最大值,scala,apache-spark,apache-spark-sql,spark-streaming,spark-dataframe,Scala,Apache Spark,Apache Spark Sql,Spark Streaming,Spark Dataframe,我想在Spark程序中遍历dataframe的列,并计算最小值和最大值。 我是Spark和scala的新手,在数据帧中获取数据后,无法对列进行迭代 我已经尝试运行下面的代码,但它需要向它传递列号,问题是如何从dataframe中获取它并动态传递它,并将结果存储在集合中 val parquetRDD = spark.read.parquet("filename.parquet") parquetRDD.collect.foreach ({ i => parquetRDD_subset.ag

我想在Spark程序中遍历dataframe的列,并计算最小值和最大值。 我是Spark和scala的新手,在数据帧中获取数据后,无法对列进行迭代

我已经尝试运行下面的代码,但它需要向它传递列号,问题是如何从dataframe中获取它并动态传递它,并将结果存储在集合中

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()})

感谢您在这方面的帮助。

您不应该在行或记录上进行迭代。您应该使用聚合函数

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。您不应该对行或记录进行迭代。您应该使用聚合函数

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()

它提供了所有列的统计信息,包括最小值、最大值、平均值、计数和STDEV

感谢Assaf的回复。但在这里,val aggCol=col(df.columns(2))中,我们实际上不是手动传递列号(本例中为2)。有没有一种方法可以动态地传递它,这样我就可以在循环中一个接一个地迭代列,并生成最小-最大值。谢谢你。谢谢阿萨夫!它确实有帮助,但可以将其写入循环中,这样我就不需要手动传递列名。当我在问题中提到iterate时,我的意思是逐列循环。在下面的示例中,我们有三列,我希望动态地选择每一列,计算其最小值和最大值,而不必手动传递列名。假设col1、col2、col3、col1、col2、col3的任意一组值都是Hanks Assaf,用于您的响应。但在这里,val aggCol=col(df.columns(2))中,我们实际上不是手动传递列号(本例中为2)。有没有一种方法可以动态地传递它,这样我就可以在循环中一个接一个地迭代列,并生成最小-最大值。谢谢你。谢谢阿萨夫!它确实有帮助,但可以将其写入循环中,这样我就不需要手动传递列名。当我在问题中提到iterate时,我的意思是逐列循环。在下面的示例中,我们有三列,我希望动态地选择每一列,计算其最小值和最大值,而不必手动传递列名。假设col1、col2、col3 col1 col2 col3的任意随机值集