首页 文章

键/值对RDD

提问于
浏览
0

我对键/值对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() 将每个类型的输入文件组合在一起 . 所有恐怖电影的 Value 观,喜剧电影在一起等等 .

有没有办法我可以这样生成键/值对 (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 回答

  • 1

    试试这个:

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

    如果这对您有用,请告诉我!

    Update:

    要获得 (horror, 100) 格式的输出:

    val output = ipfile.map{case (k, v) => (k.split("_")(1),v.count(_ == '\n'))}.reduceByKey(_ + _)    
    output.collect
    

相关问题