【问题标题】:Key/Value pair RDD键/值对 RDD
【发布时间】:2016-09-22 12:39:55
【问题描述】:

我有一个关于键/值对 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))

我还尝试进行一些映射和拆分操作以删除密钥的文件夹路径以仅获取文件名,但我无法将相应的值附加到文件中。

我也想知道如何获取 values1、values2、values3 等中的行数。

我的最终输出应该是这样的

(恐怖,100)

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

【问题讨论】:

    标签: scala apache-spark bigdata


    【解决方案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
    

    【讨论】:

    • 太棒了!这也有效。我做了拆分而不是使用 _ == '\n' 。非常感谢
    • 很高兴它帮助了你!
    猜你喜欢
    • 2021-11-11
    • 2016-01-15
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多