Извлечение поля времени из столбца Pyspark по сравнению с извлечением поля времени из столбца Pandas datetime

#python #apache-spark #pyspark #apache-spark-sql

#python #apache-spark #pyspark #apache-spark-sql

Вопрос:

Я переношу свой код из pandas в Pyspark и хочу знать, как я могу извлечь поле времени из следующего столбца :

 df['DATE'] : 
0          2020-10-12 00:00:47
1          2020-10-12 00:01:45
2          2020-10-12 00:02:44
                  ...         
4211872    2020-10-16 15:12:35
4211876    2020-10-16 15:16:32
Name: DATE, Length: 4211877, dtype: object
 

В pandas для этого я использовал следующие две строки кода:

 CSV_DF['date']=[datetime.strptime(x, '%Y-%m-%d %H:%M:%S').date()  for x in CSV_DF['DATE'] ] #date in utc 
CSV_DF2['time']=[datetime.strptime(x, '%Y-%m-%d %H:%M:%S').time() for x in CSV_DF2['DATE']]# time in utc
 

В Spark я нахожу, как извлечь поле даты, но извлеченное поле времени было неправильным. Я использовал следующие две строки :

 CSV_DF = CSV_DF.withColumn("date", func.to_date(func.col("DATE"))) # It was correct I got the correct time
CSV_DF = CSV_DF.withColumn('time', date_format("DATE", 'HH:mm:ss')) # I always got 00:00:00 for each day and it is not correct 
 

Есть ли какой-либо другой метод, который я мог бы применить

Ответ №1:

Обратите внимание, что столбцы Spark не чувствительны к регистру, поэтому ваш первый withColumn столбец даты был перезаписан. Во втором withColumn случае форматируется новый столбец даты, в котором нет информации о времени, поэтому вы всегда получаете 00:00:00.

Вы также можете использовать .cast('timestamp') или .cast('date') , как показано ниже. Обратите внимание, что это не очень хорошая идея для использования date_format со строковыми столбцами. Это лучше всего работает со столбцами timestamp / date, но не всегда работает со строковыми столбцами.

 df.show()    # date is a string column
 --- ------------------- 
| id|               date|
 --- ------------------- 
|  0|2020-10-12 00:00:47|
|  1|2020-10-12 00:01:45|
|  2|2020-10-12 00:02:44|
 --- ------------------- 

import pyspark.sql.functions  as F

df.select(
    F.col('date').cast('date').alias('date'),
    F.date_format(F.col('date').cast('timestamp'), 'HH:mm:ss').alias('time')
).show()
 ---------- -------- 
|      date|    time|
 ---------- -------- 
|2020-10-12|00:00:47|
|2020-10-12|00:01:45|
|2020-10-12|00:02:44|
 ---------- -------- 
 

Комментарии:

1. это то же самое, что время всегда равно 00:00:00 для всех значений

2. @baddy возможно, вам придется перечитать фрейм данных csv_df, потому что вы стерли исходный столбец даты

3. да, точно! Я перечитал его, и он работает очень хорошо, большое вам спасибо, я приму ваш ответ, еще раз спасибо

4. могу ли я узнать, почему вы сказали: «Это лучше всего работает со столбцами timestamp / date, но не всегда работает со строковыми столбцами». о date_format

5. date_format работает только со строками даты в стандартном формате гггг-мм-дд чч: мм: сс. Для преобразования строк других форматов даты / времени используйте to_timestamp(col, format) .