Spark: не удается преобразовать строку в формат данных

#scala #apache-spark

#scala #apache-spark

Вопрос:

Я не могу преобразовать формат строки в формат даты.

 val df7 = Seq(("01/01/2007 12:00:00 AM"),("01/01/2006 12:00:00 AM"), ("01/01/2008 12:00:00 AM"), ("01/01/2006 12:00:00 AM")).toDF("r1")
df7.show()
df7.select(col("r1"), to_date( substring(col("r1"), 0, 11), "MM/DD/YYYY")  ).show()
  

Обратите внимание, что на выходе преобразуется только строка с 2006 годом

  -------------------- 
|                  r1|
 -------------------- 
|01/01/2007 12:00:...|
|01/01/2006 12:00:...|
|01/01/2008 12:00:...|
|01/01/2006 12:00:...|
 -------------------- 

 -------------------- --------------------------------------------- 
|                  r1|to_date(substring(`r1`, 0, 11), 'MM/DD/YYYY')|
 -------------------- --------------------------------------------- 
|01/01/2007 12:00:...|                                         null|
|01/01/2006 12:00:...|                                   2006-01-01|
|01/01/2008 12:00:...|                                         null|
|01/01/2006 12:00:...|                                   2006-01-01|
 -------------------- --------------------------------------------- 
  

Ответ №1:

Пожалуйста, используйте эту строку

 df7.select(col("r1"), to_date( substring(col("r1"), 0, 10), "MM/dd/yyyy")  ).show()
  

для анализа дат.

В коде есть два изменения:

  • используйте длину 10 вместо 11 , чтобы отрезать дополнительное пространство
  • строка формата чувствительна к регистру и использует символы формата SimpleDateFormat Java

Ответ №2:

Вам не нужно указывать подстроку, но укажите точный формат метки времени.

 val df7 = Seq(("01/01/2007 12:00:00 AM"),("01/01/2006 12:00:00 AM"), ("01/01/2008 12:00:00 AM"), ("01/01/2006 12:00:00 AM")).toDF("r1")
df7.select(col("r1"), to_date($"r1", "MM/dd/yyyy hh:mm:ss aa")).show(false)

 ---------------------- --------------------------------------- 
|r1                    |to_date(`r1`, 'MM/dd/yyyy hh:mm:ss aa')|
 ---------------------- --------------------------------------- 
|01/01/2007 12:00:00 AM|2007-01-01                             |
|01/01/2006 12:00:00 AM|2006-01-01                             |
|01/01/2008 12:00:00 AM|2008-01-01                             |
|01/01/2006 12:00:00 AM|2006-01-01                             |
 ---------------------- ---------------------------------------