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

scala – 如何将DataFrame中的struct映射到case类?

发布时间:2020-12-16 18:06:41 所属栏目:安全 来源:网络整理
导读:在我的应用程序中的某个时刻,我有一个DataFrame,其中包含从案例类创建的Struct字段.现在我想将它转换/映射回case类类型: import spark.implicits._case class Location(lat: Double,lon: Double)scala Seq((10,Location(35,25)),(20,Location(45,35))).toDF
在我的应用程序中的某个时刻,我有一个DataFrame,其中包含从案例类创建的Struct字段.现在我想将它转换/映射回case类类型:

import spark.implicits._
case class Location(lat: Double,lon: Double)

scala> Seq((10,Location(35,25)),(20,Location(45,35))).toDF
res25: org.apache.spark.sql.DataFrame = [_1: int,_2: struct<lat: double,lon: double>]

scala> res25.printSchema
root
 |-- _1: integer (nullable = false)
 |-- _2: struct (nullable = true)
 |    |-- lat: double (nullable = false)
 |    |-- lon: double (nullable = false)

基本的:

res25.map(r => {
   Location(r.getStruct(1).getDouble(0),r.getStruct(1).getDouble(1))
}).show(1)

看起来很脏
有没有更简单的方法?

解决方法

在Spark 1.6中,如果要保留保留的类型信息,请使用数据集(DS),而不是DataFrame(DF).

import spark.implicits._
case class Location(lat: Double,35))).toDS
res25: org.apache.spark.sql.Dataset[(Int,Location)] = [_1: int,lon: double>]

scala> res25.printSchema
root
 |-- _1: integer (nullable = false)
 |-- _2: struct (nullable = true)
 |    |-- lat: double (nullable = false)
 |    |-- lon: double (nullable = false)

它会给你数据集[(Int,Location)].现在,如果你想再次回到它的case类原点,那么就这样做:

scala> res25.map(r => r._2).show(1)
+----+----+
| lat| lon|
+----+----+
|35.0|25.0|
+----+----+

但是,如果你想坚持DataFrame API,因为它是动态类型的性质,那么你必须像这样编码它:

scala> res25.select("_2.*").map(r => Location(r.getDouble(0),r.getDouble(1))).show(1)
+----+----+
| lat| lon|
+----+----+
|35.0|25.0|
+----+----+

(编辑:李大同)

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

    推荐文章
      热点阅读