Scala 订购RDD[字符串]
考虑Scala 订购RDD[字符串],scala,apache-spark,Scala,Apache Spark,考虑 val animals = List("penguin","ferret","cat").toSeq val rdd = sc.makeRDD(animals, 1) 我想订购这个RDD。我是Scala新手,对如何实现这一点有点困惑。可以找到RDD文档。请按以下顺序查看: sortBy[K]( f: (T) ⇒ K, ascending: Boolean = true, numPartitions: Int = this.partitions.size ) K是您排序
val animals = List("penguin","ferret","cat").toSeq
val rdd = sc.makeRDD(animals, 1)
我想订购这个RDD。我是Scala新手,对如何实现这一点有点困惑。可以找到RDD文档。请按以下顺序查看
:
sortBy[K](
f: (T) ⇒ K,
ascending: Boolean = true,
numPartitions: Int = this.partitions.size
)
K
是您排序所依据的RDD片段的类型f
是一个函数,您可以使用def
在别处定义并按名称传递它,也可以在线匿名创建一个函数(更像scala)<代码>升序
和numPartitions
应该是自解释的
因此,考虑到所有这些,请尝试:
rdd.sortBy[String]({animal => animal})
然后试试这个:
rdd.sortBy[String]({animal => animal}, false)
然后这个,按照动物名称中字母“e”的数量,从大到小对RDD进行排序:
rdd.sortBy[Int]({a => a.split("").filter(char => char == "e").size}, false)
需要注意的是,原始的
rdd
没有被排序——一个新的、排序的rdd由操作返回。我不知道spark,但也许这就是你的答案:在第一种情况下,我们只返回我们给出的,但我们遵循字母顺序,这是为什么?它与隐式排序[K]有什么关系?它遵循默认排序[K],其中K与sortBy[K]中的K相同。我相信您可以重写排序[K],但我从来没有必要这样做。在这种情况下,似乎您可以完全忽略匿名函数?这是让我困惑的一部分,但我确实理解您所列出的内容,这非常有帮助。匿名函数只允许您选择RDD行中用于比较的部分。是的,在您的示例中,它是微不足道的,因为它使用整行。但是如果你需要的话,你可以做其他更有趣的事情。啊哈,RDD莱姆中更有意义的部分。我试着通过,但它抛出了一个错误,这不应该使用整条线吗?