2017-06-07 5 views
0

Sparkを使用して、YouTubeデータセットを分析して、アップロードされたビデオの最大数を含む上位5つのカテゴリを見つけます。Spark - タスク内の例外

データをロードします。4列目ペア

val pairRDD = countRDD.map(x => (x,1)) 
を作成し

val countRDD = textRDD.map(line => line.split("\t")(3)) 

を抽出することによりRDDを作成しRDD

textRDD.first 
res268: String = QuRYeRnAuXM EvilSquirrelPictures 1135 Pets & Animals 252 1075 4.96 46 86 gFa1YMEJFag nRcovJn9xHg 3TYqkBJ9YRk rSJ8QZWBegU 0TZqX5MbXMA UEvVksP91kg ZTopArY7Nbg 0RViGi2Rne8 HT_QlOJbDpg YZev1imoxX8 8qQrrfUTmh0 zQ83d_D2MGs u6_DQQjLsAw 73Wz9CQFDtE 

val textRDD = sc.textFile("hdfs://quickstart.cloudera:8020/user/cloudera/spark/youtubedata.txt") 

最初の行

ここまではすべて正常に動作していました。私が間違っている可能性が

17/06/07 07:55:59 ERROR executor.Executor: Exception in task 0.0 in stage 262.0 (TID 245) java.lang.ArrayIndexOutOfBoundsException: 3 
at $line486.$read$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$anonfun$1.apply(<console>:32) 
at $line486.$read$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$anonfun$1.apply(<console>:32) 
at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
. 
. 
. 

: 最後のステップは、上記の手順は、以下のエラーを

val result = pairRDD.reduceByKey(_ + _).sortByKey(false).take(5) 

リストからトップ5を取得するために戻っているのですか?

答えて

0

データセットの一部の行にNULL値がありました。 それで、エラーなしで正しい結果を出したコードを修正しました。

val countRDD = textRDD.map(line => {val temp = line.split("\t"); if(temp.length >= 3)temp(3)}) 
0

エラーは、このように\t、ファイルがtextFile APIを使用して読み込まれると、すべての行がstringに変換されない

あなたが takeを行い、最終的なラインでなく、次の行で
val countRDD = textRDD.map(line => line.split("\t")(3)) 

です(タブ)は保持されません。そして、あなたは、ステートメントの上に"\t"

を使用して分割することはできませんので、エラーがスローされなかっただけtransformationですが、ときtakeactionは、エラーがスローされた行いました。

Kの期待文字列の両側に分割文字(ストリング)を挿入して入力ファイルを編集するか、読み込んだ行を分割する適切な方法を見つける必要があります。

+0

あなたは何を意味するか、私はということでした何を意味するのか@philantrovert – philantrovert

+0

を「すべての行を文字列に変換されたファイルは、テキストファイルのAPIを使用して読み込まれ_When、これ\ tの(タブ)がpreserved._されていません」 \ t(タブ)は一連のスペースとして扱われます。そうじゃない? –

0

plain \ "をline.split(" \ s + ")に分割します。

\ sは[\ t \ n \ x0B \ f \ r]と同等で、問題を解決する必要があります。

関連する問題