在spark中使用OrderedRDD函数

时间:2016-09-16 20:37:51

标签: scala sorting apache-spark rdd

我无法理解可以调​​用sortByKey等函数的集合的数据类型。我有一个ListMap(我想要一个按顺序存储元素的数据结构),我想调用sortByKey。列表映射的内容是第一个n个数字作为键,1个作为值的值。我应该使用什么而不是列表地图?

val l = (1 to 1000).toList
val d = ListMap(l.map(s=> s -> 1):_*)
val rdd = sc.parallelize(Seq(d))
rdd.collect()
val sorted = rdd.sortByKey()
sorted.collect()

3 个答案:

答案 0 :(得分:1)

要求非常简单:

  • 您需要RDD[(K, V)]
  • 在给定范围内,implicit必须有Ordering K

你的例子并没有多大意义,因为你创建的RDD只有一个元素,所以实际上没有什么可以排序的。也许你想要这样的东西:

sc.range(1,  1001).map((_, 1)).sortByKey()

答案 1 :(得分:0)

您不需要ListMap。您所需要的只是一个RDD,其中包含一个基本的键和值元组,格式为RDD[(K, V)],在您的情况下我们有一个RDD[(Int, Int)]

val rdd: RDD[(Int, Int)] = sc.parallelize((1 to 1000).map(k => (k -> 1)).toSeq)

rdd.sortByKey().collect()

您还需要一个Ordering,您目前可以免费获得Int类型的原语。

答案 2 :(得分:0)

来自Spark programming guide

  

sortByKey ([升序],[numTasks])

     

当调用K实现Ordered的(K,V)对数据集时,   返回按键升序排序的(K,V)对数据集   降序,如布尔升序参数中所指定的。

所以你需要一个可以订购密钥的PairRDD,参见其他答案的例子。