2017-10-15 11 views
-1

私はスカラの初心者です。データセットをのペアにマップすることです。ここで、kv(0)kv(1)は文字列で、kv(2)はリストです。データセット内kv(2)のためのいくつかの空のリストがあり、スカラを使用してスパークしたアウトオブバウンド例外

val rdd_q1_bs = rdd_business.map(lines => lines.split('^')).map(kv => 
    (kv(0), (kv(1), kv(2)))) 

しかし、ここで問題です:コードが下に表示されます。したがって、すべての要素を集めるのに.collect()を使用すると、範囲外の例外が発生する可能性があります。 私が考えているのは、機能を定義し、長さを確認することですkv。私は例外を無視してプロセスを維持するか、kv(2)をStringに置き換えることができる簡単な方法はありますか?

答えて

0

lines => lines.split('^')機能がrdd_business RDDはすべてRDD[String]であることを示唆していると、あなたは(0)、KV(1)及びKV KVを使用して配列の要素を抽出しようとしていることから、あなたにRDD[Array[String]]を与えると考え^で文字列を分割します(2)。例外は、RDD[String]rdd_businessオブジェクト)のいずれかに1つしかない可能性があるためです。

だからこのような場合は、TryまたはOptionを使用してください。

import scala.util.Try 
val rdd_q1_bs = rdd_business.map(lines => lines.split('^')).map(kv => 
    (kv(0), (kv(1), Try(kv(2)) getOrElse("not found")))) 

より良い安全のために、あなたはあなたにも Optionに同じ道を進むことができ

val rdd_q1_bs = rdd_business.map(lines => lines.split('^')).map(kv => 
    (Try(kv(0)) getOrElse("notFound"), (Try(kv(1)) getOrElse("notFound"), Try(kv(2)) getOrElse("not found")))) 

として配列のすべての要素にTryまたはOptionを適用することができます。

回答が役に立ちそうです

+0

これは本当に役に立ちます、感謝〜 –

関連する問題