2017-07-03 64 views
0

我是一个新手,函数式编程语言,我努力学习火花斯卡拉 的目标是按主题划分的RDF datset 的代码如下:按主题火花阶Partitionning的RDF数据集

object SimpleApp { 

    def main(args: Array[String]): Unit = { 

    val sparkConf = 
     new SparkConf(). 
     setAppName("SimpleApp"). 
     setMaster("local[2]"). 
     set("spark.executor.memory", "1g") 

    val sc = new SparkContext(sparkConf) 

    val data = sc.textFile("/home/hduser/Bureau/11.txt") 
    val subject = data.map(_.split("\\s+")(0)).distinct.collect 

    } 

} 

所以我得到恢复主题,但它返回一个字符串数组也mapPartitions(func)和mapPartitionsWithIndex(func):func需要迭代器 那么我该如何继续?

+0

你能添加您的输入文件的样本和它生成的输出? – jsdeveloper

+0

我的输入文件是Ntriples格式的rdf数据集:对于每行我们都有主题,对象和谓词以及它生成的输出:HashPartitioner无法对数组键进行分区。 – Marry

+0

如果解决了您的问题,请将答案标记为正确 – jsdeveloper

回答

0

按主题对RDD进行分区可能最好通过使用HashPartitioner来完成。所述HashPartitioner的工作原理是通过键例如以N元组的RDD和排序数据

myPairRDD:

("sub1", "desc1") 
("sub2", "desc2") 
("sub1", "desc3") 
("sub2", "desc4") 

myPairRDD.partitionBy(new HashPartitioner(2)) 

变为:

分区1:

("sub1", "desc1") 
("sub1", "desc3") 

分区2:

("sub2", "desc2") 
("sub2", "desc4") 

因此,您subject小号RDD或许应该创造更多这样的(注意哪些创建一个元组/对RDD额外的括号内):

val subjectTuples = data.map((_.split("\\s+")(0), _.split("\\s+")(1))) 

见图表此处获得更多信息:https://blog.knoldus.com/2015/06/19/shufflling-and-repartitioning-of-rdds-in-apache-spark/