我正在尝试从Spark中生成一个Spark数据帧,该数据帧已使用apache Livy进行了初始化。
我首先在这个更为复杂的hbase调用中注意到了这个问题:
import spark.implicits._
...
spark.sparkContext
.newAPIHadoopRDD(
conf,
classOf[TableInputFormat],
classOf[ImmutableBytesWritable],
classOf[Result]
)
.toDF()
但是我发现我可以在一个简单的事情上发生同样的事情:
import spark.implicits._
...
val filtersDf = filters.toDF()
filtersDf
只是一系列案例类。
常见的问题是*.toDF()
,但是*.toDS()
也会发生,这使我认为import spark.implicits._
上的隐式解析不起作用。要转换为数据框的基础对象确实具有数据。
错误堆栈看起来与使用scala运行时反射的运行时隐式解析有关。
请注意,我已经检查过了,spark和编译后的代码都使用相同版本的Scala(2.11)。
我得到的例外是:
java.lang.RuntimeException: java.util.NoSuchElementException: head of empty list
scala.collection.immutable.Nil$.head(List.scala:420)
scala.collection.immutable.Nil$.head(List.scala:417)
scala.collection.immutable.List.map(List.scala:277)
scala.reflect.internal.Symbols$Symbol.parentSymbols(Symbols.scala:2117)
scala.reflect.internal.SymbolTable.openPackageModule(SymbolTable.scala:301)
scala.reflect.internal.SymbolTable.openPackageModule(SymbolTable.scala:341)
scala.reflect.runtime.SymbolLoaders$LazyPackageType$$anonfun$complete$2.apply$mcV$sp(SymbolLoaders.scala:74)
scala.reflect.runtime.SymbolLoaders$LazyPackageType$$anonfun$complete$2.apply(SymbolLoaders.scala:71)
scala.reflect.runtime.SymbolLoaders$LazyPackageType$$anonfun$complete$2.apply(SymbolLoaders.scala:71)
scala.reflect.internal.SymbolTable.slowButSafeEnteringPhaseNotLaterThan(SymbolTable.scala:263)
scala.reflect.runtime.SymbolLoaders$LazyPackageType.complete(SymbolLoaders.scala:71)
scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1514)
scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$1.scala$reflect$runtime$SynchronizedSymbols$SynchronizedSymbol$$super$info(SynchronizedSymbols.scala:174)
scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anonfun$info$1.apply(SynchronizedSymbols.scala:127)
scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anonfun$info$1.apply(SynchronizedSymbols.scala:127)
scala.reflect.runtime.Gil$class.gilSynchronized(Gil.scala:19)
scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:16)
scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$class.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:123)
scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$1.gilSynchronizedIfNotThreadsafe(SynchronizedSymbols.scala:174)
scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$class.info(SynchronizedSymbols.scala:127)
scala.reflect.runtime.SynchronizedSymbols$SynchronizedSymbol$$anon$1.info(SynchronizedSymbols.scala:174)
scala.reflect.internal.Types$TypeRef.thisInfo(Types.scala:2194)
scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2199)
scala.reflect.internal.tpe.FindMembers$FindMemberBase.<init>(FindMembers.scala:17)
scala.reflect.internal.tpe.FindMembers$FindMember.<init>(FindMembers.scala:219)
scala.reflect.internal.Types$Type.scala$reflect$internal$Types$Type$$findMemberInternal$1(Types.scala:1014)
scala.reflect.internal.Types$Type.findMember(Types.scala:1016)
scala.reflect.internal.Types$Type.memberBasedOnName(Types.scala:631)
scala.reflect.internal.Types$Type.member(Types.scala:600)
scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:66)
scala.reflect.internal.Mirrors$RootsBase.staticPackage(Mirrors.scala:204)
scala.reflect.runtime.JavaMirrors$JavaMirror.staticPackage(JavaMirrors.scala:82)
scala.reflect.internal.Mirrors$RootsBase.init(Mirrors.scala:263)
scala.reflect.runtime.JavaMirrors$class.scala$reflect$runtime$JavaMirrors$$createMirror(JavaMirrors.scala:32)
scala.reflect.runtime.JavaMirrors$$anonfun$runtimeMirror$1.apply(JavaMirrors.scala:49)
scala.reflect.runtime.JavaMirrors$$anonfun$runtimeMirror$1.apply(JavaMirrors.scala:47)
scala.reflect.runtime.Gil$class.gilSynchronized(Gil.scala:19)
scala.reflect.runtime.JavaUniverse.gilSynchronized(JavaUniverse.scala:16)
scala.reflect.runtime.JavaMirrors$class.runtimeMirror(JavaMirrors.scala:46)
scala.reflect.runtime.JavaUniverse.runtimeMirror(JavaUniverse.scala:16)
scala.reflect.runtime.JavaUniverse.runtimeMirror(JavaUniverse.scala:16)
我的工作假设是我缺少依赖项或导入项,这是某种scala-ism。
我尚未找到与此问题有关的其他参考。最终,我认为这可能取决于进口/依赖关系,但到目前为止,我还不清楚。任何帮助,不胜感激。我热衷于了解解决问题的方法,或者通过比toDf()
少的魔术方法来创建数据帧。
火花信息:
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.3.2.0-mapr-1901
/_/
Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_191)
答案 0 :(得分:0)
我在同一版本的spark上遇到了此错误,但是,我从hdfs读取csv时看到了错误,这是我正在做的一个示例:
val csv: DataFrame = ss
.read
.option("header", "true")
.option("mode", "DROPMALFORMED")
.csv(filePath)
println(csv.count())
This是我看到错误源自spark。
的地方。我举了一个失败的小例子,试图找出导致问题的原因。我正在使用livy scala编程api提交作业以激发灵感。我发现这是失败的,因为我通过参数传递的参数通过livy发出了火花,这很有意义,因为这是scala反射错误。
例如,这失败了:
case class FailingJob(someSeq: Seq[String], filePath: String) {
...
def call(scalaJobContext: ScalaJobContext): Unit = {
// It doesn't really matter what I do here.
// Main this is that the seq is used in some way.
val mappedSeq = someSeq.map(s => s.toUpperCase())
val ss: SparkSession = scalaJobContext.sparkSession
val csv: DataFrame = ss
.read
.option("header", "true")
.option("mode", "DROPMALFORMED")
.csv(filePath)
println(csv.count())
...
for {
_ <- livyClient.submit(FailingJob(someSeq, path).call)
...
这是成功的:
case class SuccessfulJob(someArray: Array[String], filePath: String) {
...
def call(scalaJobContext: ScalaJobContext): Unit = {
// It doesn't really matter what I do here.
// Main this is that the seq is used in some way.
val mappedSeq = someArray.map(s => s.toUpperCase())
val ss: SparkSession = scalaJobContext.sparkSession
val csv: DataFrame = ss
.read
.option("header", "true")
.option("mode", "DROPMALFORMED")
.csv(filePath)
println(csv.count())
...
for {
_ <- livyClient.submit(SuccessfulJob(someArray, path).call)
...
因此,如果我传入类型为Seq
的参数,则会失败,这使我认为这是序列化/反序列化Wihtin kryo
的问题。还要注意的另一件事是,如果我将该值作为对象的属性引用,则不会 not 抛出此错误。我试图升级到没有火花的2.4。我使用的是livy版本0.6.0-incubating
。我目前的工作是将对象转换为使用Array
类型而不是Seq
类型。我怀疑其他scala特定类型也会失败,尽管我还没有尝试过。
Here是我对本问题的复现,包括解决方法。我很高兴这不能解决问题,但希望它可以帮助其他在其他情况下难以解决问题的人。我还向livy提交了一个问题,以查看他们是否可以对正在发生的事情提供更多的见解。