2017-09-10 12 views
1

スパークとスカラの新機能です。スカラーでコンパイルエラーが発生しました: スパーク:値ヒストグラムはorg.apache.spark.rdd.RDDのメンバーではありません。[オプション] [任意]]

val rawData = someRDD.map{ 
    //some ops 
    Map(
    "A" -> someInt_var1 //Int 
    "B" -> someInt_var2 //Int 
    "C" -> somelong_var //Long 
    ) 
} 

次に、これらのバーのヒストグラム情報を取得したいと考えています。だから、ここに私のコードです:

rawData.map{row => row.get("A")}.histogram(10) 

、コンパイルエラーが言う:

値ヒストグラムが

org.apache.spark.rdd.RDD [任意]オプション[]のメンバーではありません

私はなぜrawData.map{row => row.get("A")}org.apache.spark.rdd.RDD[Option[Any]]で、それをrdd [Int]に変換するのだろうと思いますか?私は完全に混乱しているとを求めて[任意]

値オーバーライド:は、オプションのメンバーではありません。

rawData.map{row => row.get("A")}.map{_.toInt}.histogram(10) 

しかし、それは失敗しコンパイルします。私はこのような試みている ここで助けてください。

答えて

2

OptionMap.getはオプションを返します。 Map.getは、キーがMapに存在しない場合はNoneを返します。また、Option[Any]はMapのValueのその他のデータ型にも関連していますが、私はIntとLongの両方を持っています。Anyの代わりにAnyValを返します。

可能な解決策は、キーが存在しない場合、デフォルト値を提供することで、オプションを取り除くためにgetOrElseを使用して、あなたがAの値は常にint型であることを確認している場合、あなたはIntAnyValから、それを変換することができますですasInstanceOf[Int]を使用。

簡略化した例は、以下のよう

val rawData = sc.parallelize(Seq(Map("A" -> 1, "B" -> 2, "C" -> 4L))) 

rawData.map(_.get("A")) 
// res6: org.apache.spark.rdd.RDD[Option[AnyVal]] = MapPartitionsRDD[9] at map at <console>:27 

rawData.map(_.getOrElse("A", 0).asInstanceOf[Int]).histogram(10) 
// res7: (Array[Double], Array[Long]) = (Array(1.0, 1.0),Array(1)) 
関連する問題