我是ios开发人员,现在转向火花。我想知道如何使用一个聚合函数在Spark RDD中找到Max和Min? (首选Spark SQL) 例如 - 假设我的csv文件中有工资列,现在我想将其转换为Spark RDD,我想通过使用单个函数找到Max和min,还有如何在RDD中加载csv文件(首选Scala)。 我不想在数据框中转换它。我想在单个聚合函数中找到max和min,在RDD中也是如此。我不想两次使用Max和Min。
答案 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
中查找Min
和spark scala
的方法之一是将RDD
转换为dataframe
并找到Min
和{ {1}} more info
答案 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()