2017-04-12 175 views
0

我已在RDD與數組轉換RDD到數據幀

RDD[(Long, Array[(Long, Double)])] 

下面我想這個轉換成數據幀。 我使用下面的代碼

val aStruct = new StructType(Array(
    StructField("id", LongType,nullable = true), 
    StructField("neighbors",ArrayType(
     StructType(Array(
      StructField("nid", LongType), 
      StructField("distance", DoubleType) 
    ))),nullable = true))) 
val rowRDD = neighbors.map(p => Row(p._1, p._2)) 
val neighborsDF = sqlContext.createDataFrame(rowRDD,aStruct) 

這編譯正確,但給了我一個運行時錯誤

Error while encoding: java.lang.RuntimeException: scala.Tuple2$mcJD$sp is not a valid external type for schema of struct<nid:bigint,distance:double> 

是我的架構不正確的?

我也試過

import spark.implicits._ 
val neighborsDF = neighbors.toDF() 

但爲了這個,我得到以下運行時錯誤

Exception in thread "main" java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror(Ljava/lang/ClassLoader;)Lscala/reflect/api/JavaMirrors$JavaMirror; 

在我所謂的toDF行()

什麼我錯在這裏做? (我期待了很多:P)

所以我做understant這個問題,我在RDD元組的數組,但我似乎無法找到元組類型星火SQL架構

+1

第二個問題是因爲在編譯和運行時和/或Scala版本的庫上有不匹配的Scala版本 –

+0

@T.Gawęda其實你是對的,那個問題確實存在。在我的build.sbt我有scala版本2.10.5,而我的scala版本2.12.1安裝在我的系統上。我剛剛下載了2.10.5,並設置了我的路徑並通過scala -version進行了檢查,結果爲2.10.5。但是我仍然得到相同的錯誤 –

+0

也檢查Spark版本,如果它包含名稱中的2.11',它將編譯爲Scala 2.11。 Spark 2.x默認建立在Scala 2.11上 –

回答

0

由於@T。 Gawęda指出,我正在使用單獨版本的Scala進行編譯(2.10.6),並且在運行時使用了Scala 2.11.8版本的預構建Spark 2.1.0。這導致以下錯誤 Exception in thread "main" java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror(Ljava/lang/ClassLoader;)Lscala/reflect/api/JavaMirrors$JavaMirror;

當使用

neighborsDF = neighbors.toDF()

所以我不得不編譯我的代碼使用Scala版本是正確的,但由於圖書館我使用(火花鄰居)拋出使用Scala版本2.11.8時出現編譯錯誤,因此更新我的項目的scala版本實際上是不可能的。 所以我決定從鏈接Building for Scala 2.10

建立一個版本的Spark與斯卡拉2.10.6使用指南所以現在我的星火使用Scala版本2.10.6運行,我用的是同一版本使用SBT編譯我的代碼。因此,RDD無錯地轉換爲數據幀。 希望它可以幫助其他人