2016-09-22 11 views
0

キーと値のペアRDDに関する質問があります。キーと値のペアRDD

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

私はSCを使用して、入力フォルダ内のファイルを読み込むしようとしています:

は、私は次のようにファイルの内容として、映画の中でダイアログを持っていC:/download/inputフォルダ内の5つのファイルを持っています。 wholeTextFiles()私はgroupByKey()を使用して一緒にグループに各ジャンルの入力ファイルを私は持っている操作を実行しようとしてい

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

次のように私は、キー/値を取得します。すべてのホラー映画の価値、一緒のコメディ映画など。

私は

私が必要と
(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) 

次のように上記のコードは私に出力を与えている代わりに(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)) 

のキー/値のペアをこのよう(horror, values)を生成することができますどのような方法があります

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

私も試してみましたファイルの名前だけを取得するために、キーのフォルダパスを削除するいくつかのマップと分割操作を行いますが、ファイルに対応する値を追加することはできません。

また、私はラインがvalues1、values2、values3などで数える取得することができますどのように知っていただきたいと思い

私の最終的な出力があるべき

のような(恐怖、100)

ここで、100は、値1 = 40行、値2 = 30行、値3 = 30行の行数の合計です。

答えて

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 
+0

その作業は、ヘルプ – Ninja

+0

ためのおかげで、更新の答えをチェックし@Ninja! – avr

+0

素晴らしい!これも同様に機能します。 _ == '\ n'を使用するのではなく、分割しました。非常にありがとう – Ninja