我有一个类型的RDD点,[(Double, Double)]我必须针对每一列迭代地对它进行排序。要进行排序的列存储在变量' axis'中,并根据RDD是按第1列还是第2列排序计算为0或1。我试过以下但是没有一个似乎有效:
val sorted = points.sortBy(p => p._(axis))
要么,
val sorted = points.sortBy(_(axis))
我收到以下错误:Error:(18, 39) (Double, Double) does not take parameters 涉及默认参数的应用程序出错。
可以使用该productElement方法动态访问元组的元素。
唯一的问题是这个方法返回一个Any,所以你需要将它转换为Double(并且这样做,你需要先转换Any为String)
试试这个:
points.sortBy(_.productElement(axis).toString.toDouble)
例
输入
points.foreach(println)
(0,1)
(1,0)
AXIS = 1
scala> val axis= 1
axis: Int = 1
scala> points.sortBy(_.productElement(axis).toString.toDouble)
res19: org.apache.spark.rdd.RDD[(Int, Int)] = MapPartitionsRDD[16] at sortBy at :28
scala> res19.foreach(println)
(1,0)
(0,1)
AXIS = 0
scala> val axis= 0
axis: Int = 0
scala> points.sortBy(_.productElement(axis).toString.toDouble)
res24: org.apache.spark.rdd.RDD[(Int, Int)] = MapPartitionsRDD[26] at sortBy at :28
scala> res24.foreach(println)
(0,1)
(1,0)
你可以这样做:
def sortValue(axis: Int)(p: (Double, Double)) = if (axis == 0) p._1 else p._2
val sorted = points.sortBy(p => sortValue(axis)(p))
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。