scala – 如何使用toDF()将自定义Java类对象的RDD转换为DataFrame?

我试图使用toDF()将Spark RDD转换为Spark SQL数据帧.我已成功多次使用此函数,但在这种情况下,我收到编译器错误:

error: value toDF is not a member of org.apache.spark.rdd.RDD[com.example.protobuf.SensorData]

这是我的代码如下:

// SensorData is an auto-generated class
import com.example.protobuf.SensorData
def loadSensorDataToRdd : RDD[SensorData] = ???

object MyApplication {
  def main(argv: Array[String]): Unit = {

    val conf = new SparkConf()
    conf.setAppName("My application")
    conf.set("io.compression.codecs", "com.hadoop.compression.lzo.LzopCodec")
    val sc = new SparkContext(conf)

    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    import sqlContext.implicits._

    val sensorDataRdd = loadSensorDataToRdd()
    val sensorDataDf = sensorDataRdd.toDF() // <-- CAUSES COMPILER ERROR
  }
}

我猜测问题出在SensorData类上,这是一个从Protocol Buffer自动生成的Java类.为了将RDD转换为数据帧,我该怎么办?

最佳答案
编译错误的原因是,范围内没有编码器将带有com.example.protobuf.SensorData的RDD转换为com.example.protobuf.SensorData的数据集.

编码器(确切地说,ExpressionEncoders)用于根据模式(通常是案例类或Java bean)将InternalRow对象转换为JVM对象.

希望您可以使用org.apache.spark.sql.Encoders对象的bean方法为自定义Java类创建一个Encoder.

Creates an encoder for Java Bean of type T.

类似于以下内容:

import org.apache.spark.sql.Encoders
implicit val SensorDataEncoder = Encoders.bean(classOf[com.example.protobuf.SensorData])

如果SensorData使用不支持的类型,则必须将RDD [SensorData]映射到某些更简单类型的RDD,例如,一个字段的元组,然后才期望到DF工作.

转载注明原文:scala – 如何使用toDF()将自定义Java类对象的RDD转换为DataFrame? - 代码日志