Muszę pobrać Year, Month, Day, Hour z ciągów w kolumnie {X1}} w iskry DF. Muszę również zapisać te wartości w oddzielnych kolumnach. Dane wyglądają tak:

ID               Time
111            2020-03-23-12:40:04
112            2020-04-23-12:40:04
113            2020-05-23-12:40:04

Żądane wyjście to:

ID        Year        Month        Day
111     2020         03            23
112     2020         04            23
113     2020         05            23

Próbowałem:

data_df.select(
    year("Time").alias('year'), 
    month("Time").alias('month'), 
    dayofmonth("Time").alias('day')
).show()

Zwrócił wszystkie wartości zerowe.

0
Chique_Code 19 październik 2020, 20:44

1 odpowiedź

Najlepsza odpowiedź

Zakładam, że kolumna Time jest ciągiem. Możesz wyodrębnić wartości, które chcesz z wyrażeniami regularnymi, ale byłoby dość bolesne. Inną opcją jest przekształcenie łańcucha w znacznik czasu, a następnie użyj funkcji year, month itp.

Ponadto twój znacznik czasu nie jest w standardowym formacie, więc musisz go określić.

data = [(111, '2020-03-23-12:40:04'),
        (112, '2020-04-23-12:40:04'),
        (113, '2020-05-23-12:40:04')]
df = spark.createDataFrame(data, ['ID', 'Time'])

df\
    .withColumn('t', F.to_timestamp('Time', 'yyyy-MM-dd-HH:mm:ss'))\
    .select('ID',
            F.year('t').alias('year'),
            F.month('t').alias('month'),
            F.dayofmonth('t').alias('day'),
            F.hour('t').alias('hour')
    ).show()

Co daje:

+---+----+-----+---+----+
| ID|year|month|day|hour|
+---+----+-----+---+----+
|111|2020|    3| 23|  12|
|112|2020|    4| 23|  12|
|113|2020|    5| 23|  12|
+---+----+-----+---+----+
1
Oli 20 październik 2020, 08:12