我正在尝试基于case类转换某些列的数据类型。
val simpleDf = Seq(("James",34,"2006-01-01","true","M",3000.60),
("Michael",33,"1980-01-10","true","F",3300.80),
("Robert",37,"1995-01-05","false","M",5000.50)
).toDF("firstName","age","jobStartDate","isGraduated","gender","salary")
// Output
simpleDf.printSchema()
root
|-- firstName: string (nullable = true)
|-- age: integer (nullable = false)
|-- jobStartDate: string (nullable = true)
|-- isGraduated: string (nullable = true)
|-- gender: string (nullable = true)
|-- salary: double (nullable = false)
这里我想更改 jobStartDate
时间戳和 isGraduated
到布尔值。我想知道是否可以使用case类进行转换?我知道这可以通过强制转换每一列来实现,但是在我的例子中,我需要根据定义的case类Map传入的df。
case class empModel(firstName:String,
age:Integer,
jobStartDate:java.sql.Timestamp,
isGraduated:Boolean,
gender:String,
salary:Double
)
val newDf = simpleData.as[empModel].toDF
newDf.show(false)
我得到错误,因为字符串的时间戳对话。有解决办法吗?
1条答案
按热度按时间eivgtgni1#
可以使用从case类生成模式
ScalaReflection
:现在,您可以在将文件加载到dataframe时传递这个模式。
或者,如果希望在读取Dataframe后强制转换某些或所有列,则可以迭代模式字段并强制转换为相应的数据类型。通过使用
foldLeft
例如: