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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |