首页 > 解决方案 > 如何使用 sparkSQL 或 Dataframe API 订购精确格式的字符串(dd-MM-yyyy HH:mm)

问题描述

我希望根据格式为“23-07-2018 16:01”的日期时间列按升序对数据框进行重新排序

我的程序按日期级别排序,但不是HH:mm标准。我希望输出包含 HH:mm 详细信息并根据它进行排序。

package com.spark
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.functions.{to_date, to_timestamp}
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._

object conversion{

  def main(args:Array[String]) = {

    val spark = SparkSession.builder().master("local").appName("conversion").enableHiveSupport().getOrCreate()

    import spark.implicits._

    val sourceDF = spark.read.format("csv").option("header","true").option("inferSchema","true").load("D:\\2018_Sheet1.csv")

    val modifiedDF = sourceDF.withColumn("CredetialEndDate",to_date($"CredetialEndDate","dd-MM-yyyy HH:mm"))

    //This converts into "dd-MM-yyyy" but "dd-MM-yyyy HH:mm" is expected
    //what is the equivalent Dataframe API to convert string to HH:mm ?

    modifiedDF.createOrReplaceGlobalTempView("conversion")

    val sortedDF = spark.sql("select * from global_temp.conversion order by CredetialEndDate ASC ").show(50)
    //dd-MM-YYYY 23-07-2018 16:01

  }
}

所以我的结果应该有格式为“ 23-07-2018 16:01 ”的列,而不仅仅是“ 23-07-2018 ”并且以升序方式排序。

标签: scalaapache-sparkdataframeapache-spark-sql

解决方案


to_date 方法将列转换为只有日期,没有时间的 DateType。尝试使用 to_timestamp 代替。

编辑:如果您想进行排序但保留原始字符串表示,您可以执行以下操作:

val modifiedDF = sourceDF.withColumn("SortingColumn",to_timestamp($"CredetialEndDate","dd-MM-yyyy HH:mm"))

然后将结果修改为:

val sortedDF = spark.sql("select * from global_temp.conversion order by SortingColumnASC ").drop("SortingColumn").show(50)

推荐阅读