2017-05-18 9 views
2

2つのRDD [Int]ソースとnoSourcesVertexがあります。 2つの新しいRDDを作成するマップを計算したいと思います。スパークのOptionとNoneの使用scalaのRDD

val sourcesFormatted = sources.map(x => (Some(x), (Some(x), Some(x)))) 
    val noSourcesVertexFormatted = noSourcesVertex.map(x => (Some(x), (Some(x), None))) 
    val outInit = sourcesFormatted.union(noSourcesVertexFormatted) 

しかし、私は前例のコードを実行するよ、私はエラーを持っている:

error: type mismatch; found : org.apache.spark.rdd.RDD[(Some[Int], (Some[Int], None.type))] required: org.apache.spark.rdd.RDD[(Some[Int], (Some[Int], Some[Int]))] val outInit = sourcesFormatted.union(noSourcesVertexFormatted)

私はその3列異なる型を持つ2 RDDに参加しようとしているため、このエラーが発生したと思います。

私はOptionのマカニズムの主張と、Some(something)とNoneが同じタイプ - > Optionを持っているため、この動作が期待できませんでした。

なぜこのエラーが発生しますか?あなたはタイプについての具体的でなければならないので

答えて

4

RDDsは不変である:

val sourcesFormatted: RDD[(Option[Int] (Option[Int], Option[Int]))] = 
    sources.map(x => (Some(x), (Some(x), Some(x)))) 
val noSourcesVertexFormatted: RDD[(Option[Int] (Option[Int], Option[Int]))] = 
    noSourcesVertex.map(x => (Some(x), (Some(x), None))) 

または

val noSourcesVertexFormatted = 
    noSourcesVertex.map(x => (Some(x), (Some(x), None: Option[Int]))) 
2

SomeNoneその逆Optionとないの両方の子です。

Option(something) 

Some(something) 

しかし

Option(null) 

を返します

に対し

None 

を返します。

ないリターン

None 

Someは、それが空でなく、値
Noneがあることも、それは空としようとしていると言うOptionを拡張case classだというOptionを拡張case classあります値を得るにはNoSuchElementException

Optionは、objectが格納する必要がありますnot null valueSome,null valueNone