webentwicklung-frage-antwort-db.com.de

PySpark Dataframe konvertiert ein ungewöhnliches Zeichenkettenformat in einen Zeitstempel

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?

14
PR102012

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.

31
zero323

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).

1
Florent F

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

0
Pedro Muñoz