尝试使用reduceByKey

时间:2017-11-16 01:25:43

标签: scala apache-spark

我有这样的数据

id,category,price,description
1,2,59.98,xyz
2,2,129.99,pqr
3,2,89.99,mno

我想使用reduceByKey作为元组按类别检索最小浮点值 我的预期答案应该是这样(2,59.98) 我尝试过这样但它说错误

val minPricedProducts= products.map(x=>(x.split(",")(1).toInt,x.split(",")(2).toFloat)).reduceByKey((a,b)=> if(a._1 < b._1) a else b).map(rec._1)
  

:33:错误:值_2不是Float的成员

1 个答案:

答案 0 :(得分:1)

简短的回答是,这将有效:

    val minPricedProducts= products.map{ x =>
       val d = x.split(",")
       (d(1).toInt,d(2).toFloat)
    }.reduceByKey( (a,b) => if(a < b) a else b)

ab不是元组,因为reduceByKey已经为您提取了元组的值部分,因此您不需要_1

请注意,我做了一次拆分,你不希望它做两次,因为它需要两倍的时间和内存。

此外,使用.reduceByKey( (a,b) => Math.min(a,b) )代替if可能更具可读性。

我不确定error: value _2 is not a member of Float _2时你是怎么得到_1的  不在您发布的代码中,您的意思是read.csv()吗?

值得注意的是,有更好的方法可以做到这一点,因为它是一个CSV文件 您可以使用df.groupBy("category").agg(min("price"))阅读,然后您可以使用VolumeChanged