Преобразовать 20180918 в 2018-09-18 в Spark?

#scala #apache-spark #apache-spark-sql

#scala #apache-spark #apache-spark-sql

Вопрос:

Заданный фрейм данных:

  ----------------- --------- ----------------- 
|   user_id|       id|     date|discount|year|
 ----------------- --------- ----------------- 
|  44143827|118775509| 20180103|     0.0|2018|                  
|  16445775|118841685| 20180105|     0.0|2018|                  
|  25230573|119388676| 20180111|     0.0|2018|                  
|  44634333|119537508| 20180112|     0.0|2018| 
  

Я хочу преобразовать эту дату из ГГГГ-ММ-дд в гггг-ММ-дд. Хотя я могу выполнить это для одного значения, т.Е.

 scala> val x = "20180918"
x: String = 20180918

scala> x.patch(4,"-",0)
res76: String = 2018-0918

scala> x.patch(4,"-",0).patch(7,"-",0)
res77: String = 2018-09-18
  

Но не смог определить полный набор данных. Пожалуйста, кто-нибудь, помогите.

Ответ №1:

Используйте функции date_format() и to_timestamp(). Проверьте это:

 scala> val df = Seq((20180103),(20180105)).toDF("dt")
df: org.apache.spark.sql.DataFrame = [dt: int]

scala> df.withColumn("dt",'dt.cast("string")).withColumn("dt",date_format(to_timestamp('dt,"yyyyMMdd"),"yyyy-MM-dd")).show(false)
 ---------- 
|dt        |
 ---------- 
|2018-01-03|
|2018-01-05|
 ---------- 

scala>
  

Обратите внимание, что date_format возвращает строку, если вы хотите, чтобы она была в типе данных date, тогда

 scala> val df2 = df.withColumn("dt",'dt.cast("string")).withColumn("dt",date_format(to_timestamp('dt,"yyyyMMdd"),"yyyy-MM-dd"))
df2: org.apache.spark.sql.DataFrame = [dt: string]

scala> df2.printSchema
root
 |-- dt: string (nullable = true)


scala> val df3 = df2.withColumn("dt",'dt.cast("date"))
df3: org.apache.spark.sql.DataFrame = [dt: date]

scala> df3.printSchema
root
 |-- dt: date (nullable = true)


scala> df3.show(false)
 ---------- 
|dt        |
 ---------- 
|2018-01-03|
|2018-01-05|
 ---------- 


scala>
  

Комментарии:

1. @RishabhOjha .. рад, что это помогло вам .. пожалуйста, подумайте о принятии ответа

Ответ №2:

В Pyspark вы могли бы сделать, как показано ниже

 # create a data frame
df = sqlContext.createDataFrame(
[
("SirChillingtonIV", "20120104"), 
("Booooooo99900098", "20120104"), 
("Booooooo99900098", "20120106"), 
("OprahWinfreyJr", "20120110"), 
("SirChillingtonIV", "20120111"), 
("SirChillingtonIV", "20120114"), 
("SirChillingtonIV", "20120811")
], 
("user_name", "login_date"))


# Import functions
from pyspark.sql import functions as f

# Create data framew with new column new_date with data in desired format
df1 = df.withColumn("new_date", f.from_unixtime(f.unix_timestamp("login_date",'yyyyMMdd'),'yyyy-MM-dd'))
  

Ответ №3:

Предполагая, что вы хотите получить строку в качестве выходных данных, вы можете создать новый UDF для преобразования входной строки из формата yyyyMMdd в yyyy-MM-dd следующий:

 def dateFormatDef(x: String): String = x.patch(4,"-",0).patch(7,"-",0)
val dateFormat = udf[String, String](dateFormatDef)
  

Вывод в виде строки в ожидаемом формате:

 df = df.withColumn("newFormat", dateFormat($"date"))
df.show()
 -------- ---------- 
|    date| newFormat|
 -------- ---------- 
|20180103|2018-01-03|
|20180105|2018-01-05|
|20180111|2018-01-11|
|20180112|2018-01-12|
 -------- ----------