键/值对RDD

时间:2016-09-22 12:39:55

标签: scala apache-spark bigdata

我对键/值对RDD有疑问。

我在C:/download/input文件夹中有五个文件,其中包含电影中的对话框作为文件内容,如下所示:

movie_horror_Conjuring.txt
movie_comedy_eurotrip.txt
movie_horror_insidious.txt
movie_sci-fi_Interstellar.txt
movie_horror_evildead.txt

我正在尝试使用sc.wholeTextFiles()读取输入文件夹中的文件,其中我获取键/值如下

(C:/download/input/movie_horror_Conjuring.txt,values)

我正在尝试进行操作,我必须使用groupByKey()将每个类型的输入文件组合在一起。所有恐怖电影的价值观,喜剧电影一起等等。

我是否有办法以(horror, values)代替(C:/download/input/movie_horror_Conjuring.txt,values)

生成键/值对
val ipfile = sc.wholeTextFiles("C:/download/input")
val output = ipfile.groupByKey().map(t => (t._1,t._2))

上面的代码给出了如下输出

(C:/download/input/movie_horror_Conjuring.txt,values)
(C:/download/input/movie_comedy_eurotrip.txt,values)
(C:/download/input/movie_horror_Conjuring.txt,values)
(C:/download/input/movie_sci-fi_Interstellar.txt,values)
(C:/download/input/movie_horror_evildead.txt,values)

我需要输出如下:

(horror, (values1, values2, values3))
(comedy, (values1))
(sci-fi, (values1))

我还尝试进行一些map和split操作来删除键的文件夹路径以仅获取文件名,但我无法将相应的值附加到文件中。

此外,我想知道如何在values1,values2,values3等中计算行数。

我的最终输出应该是

  

(恐怖,100)

其中100是values1 = 40行,values2 = 30行,values3 = 30行等等的行数之和。

1 个答案:

答案 0 :(得分:1)

试试这个:

 val output = ipfile.map{case (k, v) => (k.split("_")(1),v)}.groupByKey()    
 output.collect

请告诉我这是否适合您!

<强>更新

(horror, 100)

的格式获取输出
val output = ipfile.map{case (k, v) => (k.split("_")(1),v.count(_ == '\n'))}.reduceByKey(_ + _)    
output.collect