Как определить первое появление предметов в Pyspark

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

#питон #apache-искра #пыспарк #apache-spark-sql

Вопрос:

У меня есть фрейм данных, приведенный ниже. Мне нужно создать новую колонку с меткой как 'New' для первого появления продукта, если он появился только в 2021 году, и 'old' в противном случае. Я использую pyspark.

Ввод:

 desc year 0 a 2019 1 a 2020 2 a 2020 3 b 2020 4 b 2019 5 b 2021 6 c 2021 7 a 2021 8 c 2021 9 e 2020  

Выход:

 desc year Label 0 a 2019 old 1 a 2020 old 2 a 2020 old 3 b 2020 old 4 b 2019 old 5 b 2021 old 6 c 2021 New 7 a 2021 old 8 c 2021 New 9 e 2020 old  

Если продукт появился впервые в 2021 году без истории, то нам нужно обозначить его как новый.

Данные:

 df = spark.createDataFrame(  [  ('a','2019')  ,('a','2020')  ,('a','2020')  ,('b','2020')  ,('b','2019')  ,('b','2021')  ,('c','2021')  ,('a','2021')  ,('c','2021')  ,('e','2020')  ], ['desc', 'year'])  

Ответ №1:

Вы можете вычислить минимальное количество year окон, разделенных по продукту ( desc ), а затем проверить, равен ли результат 2021 . Наконец, чтобы получить желаемую метку вместо логического значения, вы можете использовать when функцию.

 from pyspark.sql.window import Window import pyspark.sql.functions as f win = Window.partitionBy('desc') df.withColumn("New", f.min(f.col("year")).over(win) == "2021")  .withColumn("New", f.when(f.col("New"), "New").otherwise("old"))  .show()  
  ---- ---- ---  |desc|year|New|  ---- ---- ---  | a|2019|old| | a|2020|old| | a|2020|old| | a|2021|old| | b|2020|old| | b|2019|old| | b|2021|old| | c|2021|New| | c|2021|New| | e|2020|old|  ---- ---- ---   

Ответ №2:

Я думаю, что мне ответили на тот же вопрос, но я не могу найти. В любом случае, вы можете использовать эту first функцию, чтобы найти первый год и просто 2021 проверить, так это или нет.

 from pyspark.sql import functions as f from pyspark.sql import Window w = Window.partitionBy('desc')  df.withColumn('label', f.when(f.first('year').over(w) == f.lit('2021'), f.lit('new')).otherwise(f.lit('old')))   .show()   ---- ---- -----  |desc|year|label|  ---- ---- -----  | e|2020| old| | c|2021| new| | c|2021| new| | b|2020| old| | b|2019| old| | b|2021| old| | a|2019| old| | a|2020| old| | a|2020| old| | a|2021| old|  ---- ---- -----