gpt4 book ai didi

scala - 在 spark DataFrame- Scala 中格式化 TimestampType

转载 作者:行者123 更新时间:2023-12-04 03:11:28 24 4
gpt4 key购买 nike

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

的时间戳

我尝试使用 TimestampType 作为

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

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

任何人都可以帮助将时间戳数据类型保存到具有所需格式规范的 Parquet 文件中。
编辑
输入:

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 时,datetime 字段是 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提前致谢

最佳答案

我认为您缺少的是时间戳/日期时间字段在 native 存储中没有可读格式。格式为 float 或 INT96 或其他格式,具体取决于数据库。为可读性格式化日期时间/时间戳一直是一个报告问题(即,由准备显示数据的工具执行),这就是为什么您注意到当您为日期提供字符串格式时它正确转换它以存储作为一个字符串。数据库 (spark) 只准确地存储它需要准确知道时间值是多少的内容。

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

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

关于scala - 在 spark DataFrame- Scala 中格式化 TimestampType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44956300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com