如何识别项目在 Pyspark 中的首次出现

How to identify first appearance of items in Pyspark

我有下面提供的数据框。如果产品仅在 2021 年出现,我需要为第一次出现的产品创建一个标签为 'New' 的新列,否则为 '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'])

您可以在按乘积 (desc) 划分的 window 上计算 year 的最小值,然后检查结果是否等于 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|
+----+----+---+

我想我回答了同样的问题,但找不到。无论如何,您可以使用 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|
+----+----+-----+