如何在火花中重新分配RDD?

时间:2016-01-18 08:09:58

标签: apache-spark

我有以下数据:

b   3
c   1
a   1
b   2
b   1
a   2

我希望按第一列重新分区3个部分,并保存为文件,结果应该是这样的(不需要排序):

//file: part-00000
a   1
a   2

//file: part-00001
b   3
b   2
b   1

//file: part-00002
c   1

我尝试调用重新分区功能,但它无法实现我的目的。

怎么做?非常感谢你!

3 个答案:

答案 0 :(得分:1)

自定义分区程序只能与RDD一起使用以键入键/值,即PairRDDFunctions.partitionBy(partitioner: Partitioner)。有关更多信息,请参阅firechat

答案 1 :(得分:1)

您需要调用partitionBy - 函数来使用自定义分区程序对数据进行分区。我可以推荐阅读这本在线图书的数据分区" -section:https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/ch04.html

答案 2 :(得分:0)

Sumit的回答者的更多补充:
实施您的custimized org.apache.spark.Partitioner。 例如:

class AlphbetPartitioner extends Partitioner {

  override def numPartitions: Int = 26

  override def getPartition(key: Any): Int = {

    return key.asInstanceOf[scala.Char].asDigit % numPartitions
  }
}

PairRDDFunctions.partitionBy(partitioner: Partitioner)

的示例代码
val data = Array(('b', 3), ('c', 1), ('a', 1), ('b', 2), ('b', 1), ('a', 2))
val distData = sc.parallelize(data,1).map(u => (u._1, u._2)).partitionBy(new AlphbetPartitioner).map(u=>u._1+","+u._2+"\t")