遍历火花数据框中的列并计算最小值最大值

Posted

技术标签:

【中文标题】遍历火花数据框中的列并计算最小值最大值【英文标题】:Iterate across columns in spark dataframe and calculate min max value 【发布时间】:2017-07-18 16:02:06 【问题描述】:

我想在我的 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】:

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

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 是聚合函数,它们采用一列并返回具有聚合值的列。

更新

根据 cmets,目标是为所有列设置最小值和最大值。因此,您可以这样做:

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

【讨论】:

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

以上是关于遍历火花数据框中的列并计算最小值最大值的主要内容,如果未能解决你的问题,请参考以下文章

遍历数据框中的列并创建一个列名 + str 的列表

根据熊猫数据框中的条件获取最大值和最小值

遍历数据框中的列并在同一张图上绘图(Python)

遍历熊猫数据框中的列

sql查询时间最小值的列

R;数据框中的最大和最小天数