【问题标题】:Convert Java Timestamp Datatype to Scala TimestampType将 Java 时间戳数据类型转换为 Scala 时间戳类型
【发布时间】:2020-07-30 21:02:26
【问题描述】:

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

【问题讨论】:

  • 您进行这种选角的最终目标是什么?你能对这个问题给出更详细的解释吗?
  • @BorisAzanov 我想看看用 Spark 本地语言编写我的程序是否会提高性能。所以我尽量使用最少/不使用 Java 代码。
  • 如果您提供更具体的代码示例,也许我会帮助您改进它并提高安全性。

标签: java scala apache-spark casting timestamp


【解决方案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
/*

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 2013-02-14
    • 1970-01-01
    • 2021-06-25
    • 2019-08-11
    • 2014-02-22
    • 2021-01-23
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多