Кодировка метки даты и создание нового атрибута на основе квартала с помощью pyspark

#apache-spark #pyspark

Вопрос:

У меня есть дата, и я хочу создать новые атрибуты на основе этой даты. Например.

  date                    quarter1    quarter2    quarter3   quarter4
2/3/2020(mm/dd/yyyy)        1            0.           0.        0
11/11/2020                  0            0            0         1
 

Ответ №1:

Вы можете попробовать привести столбец даты и использовать quarter функцию, а затем применить условие когда в противном случае для создания столбцов:

 from pyspark.sql import functions as F

qtrs = ['quarter1','quarter2','quarter3','quarter4']
df = df.select("*",F.concat(F.lit("quarter"),
                      F.quarter(F.to_date("date",'M/d/yyyy'))).alias("quarters"))
.select("*",*[F.when(F.col("quarters")==col,1).otherwise(0).alias(col) for col in qtrs])
.drop("quarters")
 

 df.show()
 ---------- -------- -------- -------- -------- 
|      date|quarter1|quarter2|quarter3|quarter4|
 ---------- -------- -------- -------- -------- 
|  2/3/2020|       1|       0|       0|       0|
|11/11/2020|       0|       0|       0|       1|
 ---------- -------- -------- -------- -------- 
 

По запросу ОП, добавив подход с withColumn :

 df = (df.withColumn("quarters",F.concat(F.lit("quarter"),
                      F.quarter(F.to_date("date",'M/d/yyyy'))))
   .withColumn("quarter1",F.when(F.col("quarters")=='quarter1',1).otherwise(0))
   .withColumn("quarter2",F.when(F.col("quarters")=='quarter2',1).otherwise(0))
   .withColumn("quarter3",F.when(F.col("quarters")=='quarter3',1).otherwise(0))
   .withColumn("quarter4",F.when(F.col("quarters")=='quarter4',1).otherwise(0))
   .drop("quarters")
)

df.show()
 

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

1. Как реализовать использование столбца df.withColumn и удалить столбец «четверти»!?

2. Я пытаюсь добавить этот существующий фрейм данных df !?

3. @Thedatageek 1: Для удаления столбца «четверти» просто добавьте .drop('quarters') в конце кода. 2: Использование select с циклом здесь лучше, чем писать 4 .withColumn строки. 3: Фреймы данных Spark являются неизменяемыми , что означает , что вы можете создать копию только с дополнительными столбцами и не можете изменять существующий фрейм данных, если хотите назначить его существующей переменной, df=.... а out=... не в коде

4. Как добавить к существующему df??

5. У меня уже есть df фрейма данных с другими столбцами,как добавить это в этот df?