当我尝试将字符串字段转换为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")
将字段转换为时间戳。这些能够将字段转换为时间戳,但具有微秒精度。
任何人都可以帮助将timestamp数据类型保存到具有所需格式规范的镶木地板文件中。
的修改
输入:
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
提前致谢
答案 0 :(得分:1)
您可以使用unix_timestamp将字符串日期时间转换为时间戳。
unix_timestamp(Column s, String p)
转换时间字符串给定 模式(见 [http://docs.oracle.com/javase/tutorial/i18n/format/simpleDateFormat.html]) 到Unix时间戳(以秒为单位),如果失败则返回null。
val format = "yyyy-MM-dd HH:mm:ss"
dataframe.withColumn("column_A", unix_timestamp($"date", format))
希望这有帮助!
答案 1 :(得分:0)
我认为您缺少的是时间戳/日期时间字段在本机存储中没有可读格式。格式为float或INT96,或者某些格式,具体取决于数据库。格式化日期时间/时间戳以便于阅读一直是一个报告问题(IE,由准备显示数据的工具执行),这就是为什么你注意到当你提供一个字符串格式的日期,它正确地将它转换为存储作为一个字符串。数据库(spark)只存储确切知道时间值的确切内容。
您可以指定时间戳值不具有毫秒,I.E。,毫秒值为0,但不能显示毫秒数。
这类似于在数字列上指定舍入行为(也是报告问题)。