【问题标题】:How to convert Timestamp to Date format in DataFrame?如何在 DataFrame 中将时间戳转换为日期格式?
【发布时间】:2016-11-17 13:18:59
【问题描述】:

我有一个带有Timestamp 列的DataFrame,我需要将其转换为Date 格式。

是否有任何可用的 Spark SQL 函数?

【问题讨论】:

    标签: apache-spark apache-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'))
          

          【讨论】:

            猜你喜欢
            • 2016-11-26
            • 2019-02-25
            • 1970-01-01
            • 1970-01-01
            • 2017-04-18
            • 1970-01-01
            • 2015-08-19
            • 2020-02-23
            • 1970-01-01
            相关资源
            最近更新 更多