我有一个场景,我需要将RDD的Computed保存到任何格式中。为此,我已宣布如下特征:
trait Record扩展了Serializable
的产品现在,在我的计算中,我说RDD的类型是:RDD [_&lt ;: Record]
它的工作和计算很好。但是当谈到拯救RDD以说在镶木地板格式时。
import sQLContext.createSchemaRDD
上面的调用是一个隐式方法的函数,它根据传入的typeTag创建模式。
implicit def createSchemaRDD[A <: Product: TypeTag](rdd: RDD[A]) = {
...
}
现在因为我有一个通用的RDD [_&lt;:Record],所以没有TypeTag。
虽然Record扩展了Product,但它编译了。但是当它运行时,弹出一个错误&#34; _ $ 1不是一个类。&#34;
问题现在归结为如何编写一个可以处理和保存任意类型的RDD的通用框架。
修改了Above以使用DataFrames。它仍然依赖于类型标签。
这是堆栈跟踪:
Exception in thread "main" scala.ScalaReflectionException: type _$1 is not a class
at scala.reflect.api.Symbols$SymbolApi$class.asClass(Symbols.scala:275)
at scala.reflect.internal.Symbols$SymbolContextApiImpl.asClass(Symbols.scala:84)
at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:110)
at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:29)
at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:64)
at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:29)
at org.apache.spark.sql.SQLContext.createDataFrame(SQLContext.scala:367)
at org.apache.spark.sql.SQLImplicits.rddToDataFrameHolder(SQLImplicits.scala:47)
at com.weather.logmetrics.builders.ParquetBuilder$$anonfun$save$1.apply(ParquetBuilder.scala:30)
以下是DataFrame的创建方式。
def createDataFrame[A <: Product : TypeTag](rdd: RDD[A]): DataFrame = {
....
}
非常感谢任何指针。