我对键/值对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行等等的行数之和。
答案 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