首页 > 解决方案 > 如何在火花中将对象列表转换为DF?

问题描述

使用 spark 2.4.X,其中一个复杂对象具有 Joda `DateTime` 类型的字段。

我想将这个复杂的对象转换为 DF。以下是示例片段:

import spark.implicits._
import org.joda.time.{DateTime, DateTimeZone}
case class JodaTuple(n: Int, dt: org.joda.time.DateTime)
val futureDate = new DateTime(2200, 1, 1, 0, 0, DateTimeZone.UTC)
List(JodaTuple(1, futureDate)).toDF("n", "t").show()

但面临异常:

java.lang.UnsupportedOperationException: No Encoder found for org.joda.time.DateTime
- field (class: "org.joda.time.DateTime", name: "dt")
- root class: "JodaTuple"

标签: apache-sparkapache-spark-sqljodatime

解决方案


Spark使用“java.sql.Timestamp”作为“TimestampType”,Joda类型可以转换:

List((1, new java.sql.Timestamp(futureDate.getMillis))).toDF("n", "t").show(false)

如果对象有点复杂,可以创建对象的 RDD,并映射到 Spark 类型:

spark.sparkContext.parallelize(
   List(JodaTuple(1, futureDate))
 )
.map(r=>(r.n, new java.sql.Timestamp(r.t.getMillis)))
.toDF("n", "t").show(false)

推荐阅读