在 Spark DataFrame-Scala 中格式化 TimestampType

2024-03-01

当我尝试将字符串字段转换为 Spark DataFrame 中的 TimestampType 时,输出值具有微秒精度(yyyy-MM-dd HH:mm:ss.S)。但我需要的格式是yyyy-MM-dd HH:mm:ss即,不包括微秒精度。另外,我想在写入镶木地板文件时将其保存为时间戳字段。 所以我的字段的数据类型应该是格式的时间戳yyyy-MM-dd HH:mm:ss

我尝试使用 TimestampType 作为

col("column_A").cast(TimestampType)
or
col("column_A").cast("timestamp")

将字段转换为时间戳。它们能够将字段转换为时间戳,但精度为微秒。

任何人都可以帮助将时间戳数据类型保存到具有所需格式规范的镶木地板文件中。
EDIT
Input:

val a = sc.parallelize(List(("a", "2017-01-01 12:02:00.0"), ("b", "2017-02-01 11:22:30"))).toDF("cola", "colb")
scala> a.withColumn("datetime", date_format(col("colb"), "yyyy-MM-dd HH:mm:ss")).show(false)
+----+---------------------+-------------------+
|cola|colb                 |datetime           |
+----+---------------------+-------------------+
|a   |2017-01-01 12:02:00.0|2017-01-01 12:02:00|
|b   |2017-02-01 11:22:30  |2017-02-01 11:22:30|
+----+---------------------+-------------------+


scala> a.withColumn("datetime", date_format(col("colb"), "yyyy-MM-dd HH:mm:ss")).printSchema
root
 |-- cola: string (nullable = true)
 |-- colb: string (nullable = true)
 |-- datetime: string (nullable = true)

在上面,我们得到了正确的时间戳格式,但是当我们打印 Schema 时,日期时间字段是 String 类型,但我这里需要一个时间戳类型。

现在,如果我尝试将字段转换为时间戳,格式将设置为微秒精度,这不是预期的。

scala> import org.apache.spark.sql.types._
import org.apache.spark.sql.types._

scala> val a = sc.parallelize(List(("a", "2017-01-01 12:02:00.0"), ("b", "2017-02-01 11:22:30"))).toDF("cola", "colb")
a: org.apache.spark.sql.DataFrame = [cola: string, colb: string]

scala> a.withColumn("datetime", date_format(col("colb").cast(TimestampType), "yyyy-MM-dd HH:mm:ss").cast(TimestampType)).show(false)
+----+---------------------+---------------------+
|cola|colb                 |datetime             |
+----+---------------------+---------------------+
|a   |2017-01-01 12:02:00.0|2017-01-01 12:02:00.0|
|b   |2017-02-01 11:22:30  |2017-02-01 11:22:30.0|
+----+---------------------+---------------------+


scala> a.withColumn("datetime", date_format(col("colb").cast(TimestampType), "yyyy-MM-dd HH:mm:ss").cast(TimestampType)).printSchema
root
 |-- cola: string (nullable = true)
 |-- colb: string (nullable = true)
 |-- datetime: timestamp (nullable = true)

我期望的是格式yyyy-MM-dd HH:mm:ss以及字段的数据类型timestamp提前致谢


我认为您缺少的是时间戳/日期时间字段在本机存储中没有可读格式。格式为 float、INT96 或某些此类格式,具体取决于数据库。格式化日期时间/时间戳以提高可读性一直是报告关注的问题(即,由准备显示数据的工具执行),这就是为什么您注意到当您提供日期的字符串格式时,它会正确地将其转换为存储作为字符串。数据库(spark)仅存储准确了解时间值所需的内容。

您可以指定时间戳值没有毫秒,即毫秒值为 0,但不能指定它不应该显示毫秒。

这类似于在数字列上指定舍入行为(也是报告问题)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spark DataFrame-Scala 中格式化 TimestampType 的相关文章

随机推荐