2017-09-10 5 views
1

저는 스파크와 스칼라에 익숙하지 않고 스칼라에서 컴파일 오류가 발생했습니다 : 하자 나는이 바르의 히스토그램 정보를 얻으려면, 다음스파크 : 값 히스토그램은 org.apache.spark.rdd.RDD의 멤버가 아닙니다 [Option [Any]]

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

: 우리가지도를 같이하는 RDD을 가지고 말한다. 그래서, 여기 내 코드입니다 :

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) 

을하지만 실패 컴파일 :

값 toInt이 옵션의 멤버가 아닌 [모든]

나는 완전히 혼란을 추구 해요 도와주세요.

답변

2

Map.get이 옵션을 반환하기 때문에 Option이 표시됩니다. Map.get 키가 Map에 없으면 없음을 반환합니다. 그리고 Option[Any] 또한 맵 값의 기타 데이터 유형과 관련이 있습니다. 내 경우에는 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))