#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 |
---------------------- ---------------------------------------