2017-04-12 138 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无错地转换为数据帧。 希望它可以帮助其他人