是否可以将Java时间戳数据类型转换/转换为Scala TimestampType,反之亦然?
我尝试过这种方式:
val t = <Java Timestamp variable>.asInstanceOf[TimestampType]
但是出现此错误:
java.lang.ClassCastException: java.sql.Timestamp cannot be cast to org.apache.spark.sql.types.TimestampType
答案 0 :(得分:1)
在Spark org.apache.spark.sql.types.Timestamp
中-是abstract class DataType
的子类。所有这些子类都类似于DataFrame
列的元信息类型。它们不包含某些值,但是java.sql.Timestamp
包含。而且它们不是子类,这就是您无法使用asInstanceOf
进行强制转换的原因。
给你一个小例子来感受一下差异:
当您仅将数据存储到DataFrame
时,Spark会将其自身强制转换为spark.Timestamp
import java.sql.Timestamp
val t = new Timestamp(System.currentTimeMillis())
val dfA: DataFrame = Seq(
("a", t),
("b", t),
("c", t)
).toDFc"key", "time")
但是如果您想读取数据并获取java.Timestamp
,则可以这样做:
dfA.collect().foreach{
row =>
println(row.getAs[Timestamp](1))
}
// will prints
2020-07-31 00:45:48.825
2020-07-31 00:45:48.825
2020-07-31 00:45:48.825
如果您要查看DataFrame
模式:
dfA.printSchema()
dfA.schema.fields.foreach(println)
它将打印:
root
|-- key: string (nullable = true)
|-- time: timestamp (nullable = true)
StructField(key,StringType,true)
StructField(time,TimestampType,true)
但是如果您尝试使用asInctanceOf
强制转换java.Timestamp,则会得到相当大的错误:
println(t.asInstanceOf[TimestampType])
/*
java.sql.Timestamp incompatible with
org.apache.spark.sql.types.TimestampType java.lang.ClassCastException: java.sql.Timestamp incompatible with org.apache.spark.sql.types.TimestampType
/*