如何在spark RDD中找到单个聚合函数的最大值和最小值?

时间:2017-06-01 11:34:21

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

我是ios开发人员,现在转向火花。我想知道如何使用一个聚合函数在Spark RDD中找到Max和Min? (首选Spark SQL) 例如 - 假设我的csv文件中有工资列,现在我想将其转换为Spark RDD,我想通过使用单个函数找到Max和min,还有如何在RDD中加载csv文件(首选Scala)。 我不想在数据框中转换它。我想在单个聚合函数中找到max和min,在RDD中也是如此。我不想两次使用Max和Min。

3 个答案:

答案 0 :(得分:2)

您可以使用aggregate function执行自定义聚合。

聚合值应该是存储min和max

的自定义对象
case class MinMax[T](min: T, max: T)

它需要2个函数来组合聚合结果并将新值添加到聚合

def comb[T](left: MinMax[T], right: MinMax[T])(implicit ordering: Ordering[T]): MinMax[T] = {
  MinMax(min = ordering.min(left.min, right.min), max = ordering.max(left.max, right.max))
}

def seq[T](minMax: MinMax[T], value: T)(implicit ordering: Ordering[T]): MinMax[T] = {
  comb(minMax, MinMax(value, value))
}

然后有你可以汇总的那些,例如rdd与Long

val minMax = rdd.aggregate(MinMax(Long.MaxValue, Long.MinValue))((mm, t) => seq(mm, t), (l, r) => comb(l, r))
val min = minMax.min
val max = minMax.max

答案 1 :(得分:1)

Max中查找Minspark scala的方法之一是将RDD转换为dataframe并找到Min和{ {1}} more info

中的{1}}

答案 2 :(得分:-1)

    #Import necessary packages and start spark session

from pyspark.sql.functions import *
from pyspark.sql import SparkSession
spark=spark=SparkSession.builder.appName("test").getOrCreate()

    # Read the CSV file into dataframe

df=spark.read.csv("sales.csv",header=True,inferSchema=True)

    # use the agg to find max value from customer list

df3=(df
  .groupBy("CUSTOMER_ID")
  .agg(max(struct(col("CUSTOMER_ID"), col("ITEM_VAL"))).alias("max"))
  .select(col("CUSTOMER_ID"), col("max.ITEM_VAL").alias("max_ITEM_VAL"))
)

    # use the agg to find min value from customer list

df4=(df
  .groupBy("CUSTOMER_ID")
  .agg(min(struct(col("CUSTOMER_ID"), col("ITEM_VAL"))).alias("min"))
  .select(col("CUSTOMER_ID").alias("cust2"), col("min.ITEM_VAL").alias("min_ITEM_VAL"))
)

    # Join the DF's using left join on common column

df5=df3.join(df4,df3.CUSTOMER_ID == 
df4.cust2,how='left').drop("cust2")
df5.orderBy("CUSTOMER_ID").show()
    #to do max min in single line using dataframe in spark
df.agg({"colx":"max"}).union(df.agg("colx":"min")).show()