2015-09-11 15 views
6

なぜ次のエラーが発生するのですか?RDDでSpark/ScalaコンパイラがtoDFを見つけられないのはなぜですか[Map [Int、Int]]?

scala> import sqlContext.implicits._ 
import sqlContext.implicits._ 

scala> val rdd = sc.parallelize(1 to 10).map(x => (Map(x -> 0), 0)) 
rdd: org.apache.spark.rdd.RDD[(scala.collection.immutable.Map[Int,Int], Int)] = MapPartitionsRDD[20] at map at <console>:27 

scala> rdd.toDF 
res8: org.apache.spark.sql.DataFrame = [_1: map<int,int>, _2: int] 

scala> val rdd = sc.parallelize(1 to 10).map(x => Map(x -> 0)) 
rdd: org.apache.spark.rdd.RDD[scala.collection.immutable.Map[Int,Int]] = MapPartitionsRDD[23] at map at <console>:27 

scala> rdd.toDF 
<console>:30: error: value toDF is not a member of org.apache.spark.rdd.RDD[scala.collection.immutable.Map[Int,Int]] 
       rdd.toDF 

ので、ここで起こっているまさに、toDFは、データフレームにタイプ(scala.collection.immutable.Map[Int,Int], Int)のRDDを変換ではなく、タイプscala.collection.immutable.Map[Int,Int]のことができます。何故ですか?

def createDataFrame[A <: Product : TypeTag](rdd: RDD[A]): DataFrame 

:あなたは createDataFrame方法の2つの異なる実装を見つけることができます org.apache.spark.sql.SQLContextソースを見てみる場合は、

sqlContext.createDataFrame(1 to 10).map(x => Map(x -> 0)) 

を使用できない理由と同じ理由で

答えて

9

def createDataFrame[A <: Product : TypeTag](data: Seq[A]): DataFrame 

お分かりのように、どちらも必要ですAProductのサブクラスになります。 RDD[(Map[Int,Int], Int)]toDFを呼び出すと、Tuple2が実際にProductであるために機能します。 Map[Int,Int]それ自体はエラーではありません。

あなたはそれがTuple1Mapをラップすることによって動作させることができます:基本的に

sc.parallelize(1 to 10).map(x => Tuple1(Map(x -> 0))).toDF 
5

RDD内部Mapのデータフレームを作成する暗黙はありませんので。

最初の例では、タプルを返します。これは、暗黙の変換がある製品です。あなたは何の暗黙の変換はありませんそのため、あなたのRDDで地図を持って使う2番目の例では

rddToDataFrameHolder[A <: Product : TypeTag](rdd: RDD[A])

関連する問題