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