Ich verwende PySpark über Spark 1.5.0 . Ich habe ein ungewöhnliches String-Format in Zeilen einer Spalte für Datumsangaben. Es sieht aus wie das:
Row[(daytetime='2016_08_21 11_31_08')]
Gibt es eine Möglichkeit, dieses unorthodoxe yyyy_mm_dd hh_mm_dd
-Format in einen Zeitstempel zu konvertieren? Etwas, das irgendwann in die Richtung von
df = df.withColumn("date_time",df.daytetime.astype('Timestamp'))
Ich hatte gedacht, dass Spark-SQL-Funktionen wie regexp_replace
funktionieren könnten, aber natürlich muss ich _
durch -
in der Datumshälfte Und _
durch :
im Zeitteil ersetzen.
Ich dachte, ich könnte die Kolonne in 2 mit substring
aufteilen und vom Ende der Zeit rückwärts zählen. Führen Sie dann den 'regexp_replace' separat aus und verketten Sie ihn dann. Aber das scheint zu viele Operationen? Gibt es einen einfacheren Weg?
Spark> = 2.2
from pyspark.sql.functions import to_timestamp
(sc
.parallelize([Row(dt='2016_08_21 11_31_08')])
.toDF()
.withColumn("parsed", to_timestamp("dt", "yyyy_MM_dd hh_mm_ss"))
.show(1, False))
## +-------------------+-------------------+
## |dt |parsed |
## +-------------------+-------------------+
## |2016_08_21 11_31_08|2016-08-21 11:31:08|
## +-------------------+-------------------+
Spark <2.2
Es ist nichts, was unix_timestamp
nicht verarbeiten kann:
from pyspark.sql import Row
from pyspark.sql.functions import unix_timestamp
(sc
.parallelize([Row(dt='2016_08_21 11_31_08')])
.toDF()
.withColumn("parsed", unix_timestamp("dt", "yyyy_MM_dd hh_mm_ss")
.cast("double")
.cast("timestamp"))
.show(1, False))
## +-------------------+---------------------+
## |dt |parsed |
## +-------------------+---------------------+
## |2016_08_21 11_31_08|2016-08-21 11:31:08.0|
## +-------------------+---------------------+
In beiden Fällen sollte die Formatzeichenfolge mit Java SimpleDateFormat
kompatibel sein.
die Antwort von zero323 beantwortet die Frage, aber ich möchte hinzufügen, dass der Datetime-String ein Standardformat haben sollte, wenn er direkt in den Zeitstempeltyp umgewandelt werden kann:
df.withColumn('datetime', col('datetime_str').cast('timestamp'))
Es hat den Vorteil, mit Millisekunden zu arbeiten, während unix_timestamp nur eine zweite Genauigkeit hat (to_timestamp arbeitet auch mit Millisekunden, erfordert aber Spark> = 2.2 als zero323). Ich habe es in Spark 2.3.0 mit folgendem Format getestet: '2016-07-13 14: 33: 53.979' (mit Millisekunden, funktioniert aber auch ohne).
Ich stimme der ausgewählten Antwort voll und ganz zu, möchte aber das Format auf 'yyyy_MM_dd HH_mm_ss' setzen, um Probleme mit Zeitstempeln wie '2019_01_27 16_00_00' -> Stundenangabe> 12 zu vermeiden