【问题标题】:How to convert object list to DF in spark?如何在火花中将对象列表转换为DF?
【发布时间】:2020-07-16 09:01:42
【问题描述】:

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

我想将此复杂对象转换为 DF。以下是示例 sn-p:

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-spark apache-spark-sql jodatime


    【解决方案1】:

    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)
    

    【讨论】:

    • 谢谢,@pasha701。但它比你提到的要复杂一些。将元组视为已跨团队使用且不想更改数据类型的复杂对象。
    • 我无法使用 map() 函数将对象转换回元组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2021-07-02
    相关资源
    最近更新 更多