加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Spark Dataset和java.sql.Date

发布时间:2020-12-16 18:51:25 所属栏目:安全 来源:网络整理
导读:假设我有一个像这样的Spark数据集: scala import java.sql.Datescala case class Event(id: Int,date: Date,name: String)scala val ds = Seq(Event(1,Date.valueOf("2016-08-01"),"ev1"),Event(2,Date.valueOf("2018-08-02"),"ev2")).toDS 我想创建一个只
假设我有一个像这样的Spark数据集:

scala> import java.sql.Date
scala> case class Event(id: Int,date: Date,name: String)
scala> val ds = Seq(Event(1,Date.valueOf("2016-08-01"),"ev1"),Event(2,Date.valueOf("2018-08-02"),"ev2")).toDS

我想创建一个只包含名称和日期字段的新数据集.据我所知,我可以使用带有TypedColumn的ds.select(),或者我可以将ds.select()与Column一起使用,然后将DataFrame转换为Dataset.

但是,我不能让前一个选项与Date类型一起使用.例如:

scala> ds.select($"name".as[String],$"date".as[Date])
<console>:31: error: Unable to find encoder for type stored in a Dataset.  Primitive types (Int,String,etc) and Product types (case classes) are supported by importing spark.implicits._  Support for serializing other types will be added in future releases.
              ds.select($"name".as[String],$"date".as[Date])
                                                      ^

后一个选项有效:

scala> ds.select($"name",$"date").as[(String,Date)]
res2: org.apache.spark.sql.Dataset[(String,java.sql.Date)] = [name: string,date: date]

有没有办法从数据集中选择日期字段而无需转到DataFrame并返回?

解决方法

一整天都在抨击这些问题.我想你可以用一行来解决你的问题:

implicit val e: Encoder[(String,Date)] = org.apache.spark.sql.Encoders.kryo[(String,Date)]

至少那一直在为我工作.

编辑

在这些情况下,问题在于对于大多数数据集操作,Spark 2需要一个存储架构信息的编码器(可能用于优化).模式信息采用隐式参数的形式(并且一堆数据集操作具有这种隐式参数).

在这种情况下,OP为java.sql.Date找到了正确的模式,因此以下工作原理:

implicit val e = org.apache.spark.sql.Encoders.DATE

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读