如何在 DataFrame 中将时间戳转换为日期格式?
Posted
技术标签:
【中文标题】如何在 DataFrame 中将时间戳转换为日期格式?【英文标题】:How to convert Timestamp to Date format in DataFrame? 【发布时间】:2016-11-17 13:18:59 【问题描述】:我有一个带有Timestamp
列的DataFrame
,我需要将其转换为Date
格式。
是否有任何可用的 Spark SQL 函数?
【问题讨论】:
【参考方案1】:您可以cast
该专栏至今:
斯卡拉:
import org.apache.spark.sql.types.DateType
val newDF = df.withColumn("dateColumn", df("timestampColumn").cast(DateType))
Pyspark:
df = df.withColumn('dateColumn', df['timestampColumn'].cast('date'))
【讨论】:
这不是 Spark SQL。 @dslack 此解决方案使用 Spark SQL 包中可用的函数,但它不使用 SQL 语言,而是使用强大的 DataFrame API 和类似 SQL 的函数,而不是使用具有实际 SQL 查询的不太可靠的字符串。 SQL 查询有哪些不可靠的地方? @dslack 好吧,这完全取决于应用程序。一般来说,如果您的目标是生成可靠且可测试的稳定代码库,则不太建议使用查询字符串,因为它们更难更改,更容易犯简单的错误并且模块化程度较低。 需要帮助。通过 jdbc 从数据库中读取数据。 Oracle 表具有 2016 年 12 月 15 日作为具有 DATE 数据类型的字段。 Dataframe.printSchema() 显示时间戳。但是当我打印它时,它显示所有空值。【参考方案2】:在 SparkSQL 中:
SELECT
CAST(the_ts AS DATE) AS the_date
FROM the_table
【讨论】:
【参考方案3】:想象以下输入:
val dataIn = spark.createDataFrame(Seq(
(1, "some data"),
(2, "more data")))
.toDF("id", "stuff")
.withColumn("ts", current_timestamp())
dataIn.printSchema
root
|-- id: integer (nullable = false)
|-- stuff: string (nullable = true)
|-- ts: timestamp (nullable = false)
你可以使用to_date函数:
val dataOut = dataIn.withColumn("date", to_date($"ts"))
dataOut.printSchema
root
|-- id: integer (nullable = false)
|-- stuff: string (nullable = true)
|-- ts: timestamp (nullable = false)
|-- date: date (nullable = false)
dataOut.show(false)
+---+---------+-----------------------+----------+
|id |stuff |ts |date |
+---+---------+-----------------------+----------+
|1 |some data|2017-11-21 16:37:15.828|2017-11-21|
|2 |more data|2017-11-21 16:37:15.828|2017-11-21|
+---+---------+-----------------------+----------+
我会推荐使用这些方法而不是强制转换和普通 SQL。
【讨论】:
【参考方案4】:对于 Spark 2.4+,
import spark.implicits._
val newDF = df.withColumn("dateColumn", $"timestampColumn".cast(DateType))
或
val newDF = df.withColumn("dateColumn", col("timestampColumn").cast(DateType))
【讨论】:
【参考方案5】:最好用的东西..经过试验和测试-
df_join_result.withColumn('order_date', df_join_result['order_date'].cast('date'))
【讨论】:
以上是关于如何在 DataFrame 中将时间戳转换为日期格式?的主要内容,如果未能解决你的问题,请参考以下文章
在 Pandas 中将字符串列转换为日期的有效方法(在 Python 中),但没有时间戳