【问题标题】:Spark SQL - DataFrame - How to read different format date formatSpark SQL - DataFrame - 如何读取不同格式的日期格式
【发布时间】:2019-03-16 10:33:00
【问题描述】:

数据集如下所示。卡在将HIRE_DATE 格式更改为日期格式字段

EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID
100,Steven,King,SKING,515.123.4567,17-JUN-03,AD_PRES,24000, - , - ,90
101,Neena,Kochhar,NKOCHHAR,515.123.4568,21-SEP-05,AD_VP,17000, - ,100,90

还有代码sn-p

    val empData = sparkSession.read.option("header", "true").option("inferSchema", "true").
   csv(filePath)empData.printSchema()

printSchema 输出为HIRE_DATE 字段提供字符串。但我期待Dateformat 字段。我该如何改变?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    这是我的做法:

    import java.text.SimpleDateFormat
    
    val dateFormat = new SimpleDateFormat("dd-MMM-yy")
    
    def convertStringToDate(StringDate:String) = {
        val parsed = dateFormat.parse(StringDate)
        new java.sql.Date(parsed.getTime())
    } 
    
    val convertStringToDateUDF = udf(convertStringToDate _)
    
    df.withColumn("HIRE_DATE",convertStringToDateUDF($"HIRE_DATE"))
    

    【讨论】:

    • 非常感谢。这里是什么 udf。我们这样做的目的是什么。 df.withColumn("HIRE_DATE",convertStringToDateUDF($"HIRE_DATE")) - 在这里我们在 oracle 中重新分配值或创建新的值类型hir_date_1
    • Hive UDF 和 Spark SQL UDF 一样吗?
    • udf = 用户定义函数 (blog.matthewrathbone.com/2013/08/10/…)。我们正在创建一个新列,对于每条记录,convertStringToDate 的输出将应用于 $"HIRE_DATE" 的记录。因为我们使用该数据框中已存在的名称创建此列,所以它将用新列替换旧列。
    【解决方案2】:

    Spark 有自己的日期类型。如果您以格式字符串“yyyy-MM-dd”提供日期值,则可以将其转换为 Spark 的 Date 类型。所以你所要做的就是把输入日期字符串变成这种格式“yyyy-MM-dd” 对于时间和日期格式,最好使用 java.time 库。 见下文

      val df = spark.read.option("inferSchema",true).option("header", true).csv("in/emp2.txt")
    
      def formatDate(x:String):String =
      {
       val y = x.toLowerCase.split('-').map(_.capitalize).mkString("-")
       val z= java.time.LocalDate.parse(y,java.time.format.DateTimeFormatter.ofPattern("dd-MMM-yy"))
       z.toString
      }
      val myudfDate = udf ( formatDate(_:String):String )
      val df2 = df.withColumn("HIRE_DATE2", date_format(myudfDate('HIRE_DATE),"yyyy-MM-dd") )
      df2.show(false)
    
    
    +-----------+----------+---------+--------+------------+---------+-------+------+--------------+----------+-------------+----------+
    |EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL   |PHONE_NUMBER|HIRE_DATE|JOB_ID |SALARY|COMMISSION_PCT|MANAGER_ID|DEPARTMENT_ID|HIRE_DATE2|
    +-----------+----------+---------+--------+------------+---------+-------+------+--------------+----------+-------------+----------+
    |100        |Steven    |King     |SKING   |515.123.4567|17-JUN-03|AD_PRES|24000 | -            | -        |90           |2003-06-17|
    |101        |Neena     |Kochhar  |NKOCHHAR|515.123.4568|21-SEP-05|AD_VP  |17000 | -            |100       |90           |2005-09-21|
    +-----------+----------+---------+--------+------------+---------+-------+------+--------------+----------+-------------+----------+
    

    【讨论】:

    • 让我检查并执行您的代码 sn-p。顺便说一句 df2.show(假)?我知道 df2.show() ,
    • 不带(false),结果可能会在控制台中截断,如“NKOCHA...”,带(false),所有列将被展开以显示所有数据
    • 非常感谢.. 工作正常。对上述代码进行了一些更改以将字符串转换为日期对象。 empData.withColumn("HIRE_DATE1", date_format(dateFormatConversionUDF(($"HIRE_DATE")), "yyyy-MM-dd").cast("date")).. 如有错误请指正
    • 是的,对..只需将其分配给另一个“df”并使用 printSchema 进行检查
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2020-03-05
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多