Как я могу использовать regex_replace в pyspark, чтобы переформатировать дату из ггггммдд в гггг / мм / дд и переформатировать время от ЧЧммсс до ЧЧ: мм: сс

Я пытаюсь использовать regex_replace для переформатирования столбца даты из ггггммдд в гггг / мм / дд и другого столбца из ЧЧммсс в ЧЧ: мм: сс. Столбцы даты и времени являются строками.

От:

+----------+--------+
|   date   |  time  |
+----------+--------+
| 20200326 | 122450 |
+----------+--------+

Для того, чтобы:

+------------+----------+
|    date    |   time   |
+------------+----------+
| 2020/03/26 | 12:24:50 |
+------------+----------+

Вот что я попробовал:

datePattern = "([0-9]{4})([0-9]{2})([0-9]{2})"
timePattern = "([0-9]{2})([0-9]{2})([0-9]{2})"

df.withColumn("date", regexp_replace(df.date, datePattern, "$1/$2/$3"))
df.withColumn("time", regexp_replace(df.time, timePattern, "$1:$2:$3"))

Вот что я получаю:

+----------+--------+
|   date   |  time  |
+----------+--------+
| 20200326 | 122450 |
+----------+--------+

Не уверен, где я ошибся? Кроме того, есть ли лучшие практики, чем использование regex_replace?

Всего 1 ответ


Используя from_unixtime,unix_timestamp функции from_unixtime,unix_timestamp вместо regexp_replace !

df.show()
#+--------+------+
#|    date|  time|
#+--------+------+
#|20200326|122450|
#+--------+------+

df.withColumn("date",from_unixtime(unix_timestamp(col("date"),"yyyyMMdd"),"yyyy/MM/dd")).
withColumn("time",from_unixtime(unix_timestamp(col("time"),"HHmmss"),"HH:mm:ss")).
show()
#+----------+--------+
#|      date|    time|
#+----------+--------+
#|2020/03/26|12:24:50|
#+----------+--------+

From Spark-2.2+

Мы также можем использовать функции to_date (), to_timestamp () и date_format () для этого случая!

from pyspark.sql.functions import *
df.withColumn("date",date_format(to_date(col("date"),"yyyyMMdd"),"yyyy/MM/dd")).
withColumn("time",date_format(to_timestamp(col("time"),"HHmmss"),"HH:mm:ss")).
show()
#+----------+--------+
#|      date|    time|
#+----------+--------+
#|2020/03/26|12:24:50|
#+----------+--------+

Есть идеи?

10000