2016-02-05 57 views
0

我认为有可能是一个简单的解决这个,如果有人知道如何遍历基于文件名的一组文件和输出值的我想知道在斯卡拉创造价值,通过文件迭代。基于文件名

我的问题是,我想在一组每个月图中边阅读,然后创建一个单独的月度图表。

目前我这个做了很长的路要走,这是罚款,做一年价值,但我想一个方法来自动执行它。

你可以看到我的代码,低于该希望清楚地表明我在做什么。

//Load vertex data 
val vertices= (sc.textFile("D:~vertices.csv") 
    .map(line => line.split(",")).map(parts => (parts.head.toLong, parts.tail))) 

//Define function for creating edges from csv file 
def EdgeMaker(file: RDD[String]): RDD[Edge[String]] = { 
    file.flatMap { line => 
    if (!line.isEmpty && line(0) != '#') { 
     val lineArray = line.split(",") 
     if (lineArray.length < 0) { 
     None 
     } else { 
     val srcId = lineArray(0).toInt 
     val dstId = lineArray(1).toInt 
     val ID = lineArray(2).toString 
     (Array(Edge(srcId.toInt, dstId.toInt, ID))) 
     } 
    } else { 
     None 
    } 
    } 
} 

//make graphs -This is where I want automation, so I can iterate through a 
//folder of edge files and output corresponding monthly graphs. 
val edgesJan = EdgeMaker(sc.textFile("D:~edges2011Jan.txt")) 
val graphJan = Graph(vertices, edgesJan) 
val edgesFeb = EdgeMaker(sc.textFile("D:~edges2011Feb.txt")) 
val graphFeb = Graph(vertices, edgesFeb) 
val edgesMar = EdgeMaker(sc.textFile("D:~edges2011Mar.txt")) 
val graphMar = Graph(vertices, edgesMar) 
val edgesApr = EdgeMaker(sc.textFile("D:~edges2011Apr.txt")) 
val graphApr = Graph(vertices, edgesApr) 
val edgesMay = EdgeMaker(sc.textFile("D:~edges2011May.txt")) 
val graphMay = Graph(vertices, edgesMay) 
val edgesJun = EdgeMaker(sc.textFile("D:~edges2011Jun.txt")) 
val graphJun = Graph(vertices, edgesJun) 
val edgesJul = EdgeMaker(sc.textFile("D:~edges2011Jul.txt")) 
val graphJul = Graph(vertices, edgesJul) 
val edgesAug = EdgeMaker(sc.textFile("D:~edges2011Aug.txt")) 
val graphAug = Graph(vertices, edgesAug) 
val edgesSep = EdgeMaker(sc.textFile("D:~edges2011Sep.txt")) 
val graphSep = Graph(vertices, edgesSep) 
val edgesOct = EdgeMaker(sc.textFile("D:~edges2011Oct.txt")) 
val graphOct = Graph(vertices, edgesOct) 
val edgesNov = EdgeMaker(sc.textFile("D:~edges2011Nov.txt")) 
val graphNov = Graph(vertices, edgesNov) 
val edgesDec = EdgeMaker(sc.textFile("D:~edges2011Dec.txt")) 
val graphDec = Graph(vertices, edgesDec) 

任何帮助或指针在这将不胜感激。

回答

0

可以使用星火语境wholeTextFiles映射文件名,并使用命名/电话/过滤字符串/等你的价值观/输出/等

val fileLoad = sc.wholeTextFiles("hdfs:///..Path").map { case (filename, content) => ... } 

星火语境文本文件只读取数据,但不保留文件名称。

----编辑----

对不起,我似乎误解了这个问题;您可以使用

sc.wholeTextFiles("~/path/file[0-5]*,/anotherPath/*.txt").map { case (filename, content) => ... } 

星号*应加载路径中的所有文件,假设它们都支持的输入文件类型加载多个文件。

该读将所有的文件连接为1单一大RDD避免多次调用(因为每个通话,您必须指定路径和文件名是要避免我认为)。

与文件名读让你GROUPBY文件名和应用您的图形功能,每个组。