将Java时间戳数据类型转换为Scala时间戳类型

时间:2020-07-30 21:02:26

标签: java scala apache-spark casting timestamp

是否可以将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

1 个答案:

答案 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
/*