我已经创建了一堆我需要用于测试目的的案例类。我当时正在做很多这样的陈述:
case class Bar(id: Int, desc: String)
val foo = Bar(1, "baz")
val bar = sc.makeRDD(Array(foo)).toDF
有效。因为我正在做很多这些调用,所以我认为创建一个函数会很好:
def dfify[T: ClassTag](obj: T): DataFrame = sc.makeRDD(Array(obj)).toDF
然而,这给了我以下错误:
error: value toDF is not a member of org.apache.spark.rdd.RDD[T]
我尝试在稍微不同的上下文中添加上下文绑定的T<:Product [{3}},但这没有帮助。
问题在于没有它的功能,但是让一些重复的位稍微简化会很好。我认为需要花费1分钟的东西已经花费了更多而没有结果。
我在使用Spark 1.4.1并且无法更改,因此我无法使用createDataFrame()
。
想法?
答案 0 :(得分:0)
您还必须创建SQLContext
并导入其含义,否则将RDD
隐式转换为DataFrameHolder
(具有toDF
方法)isn'在范围内。
另一个问题是 - ClassTag
还不够,还需要TypeTag
。
此代码编译并运行:
import scala.reflect.runtime.universe._
import scala.reflect.ClassTag
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
def dfify[T <: Product : ClassTag : TypeTag](obj: T): DataFrame = sc.makeRDD(Array(obj)).toDF()