开发者社区> 问答> 正文

sortBy中的一列RDD

我有一个类型的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 涉及默认参数的应用程序出错。

展开
收起
社区小助手 2018-12-19 16:38:27 1887 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    可以使用该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))

    2019-07-17 23:23:02
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载