繁体   English   中英

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

[英]Convert Java Timestamp Datatype to Scala TimestampType

是否可以将 Java 时间戳数据类型转换/转换为 Scala 时间戳类型,反之亦然?

我试过这样做:

val t = <Java Timestamp variable>.asInstanceOf[TimestampType]

但是得到了这个错误:

java.lang.ClassCastException: java.sql.Timestamp cannot be cast to org.apache.spark.sql.types.TimestampType

在 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你会得到相当的错误:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM