Мой набор данных сгруппирован по двум переменным: 'customer' и 'sku' с использованием функции collect_list (), я хочу, чтобы каждая строка сохраняла переменную, сколько строк осталось в группе.
У меня есть такой вывод:
+----------+--------------------+-----------+--------------------+---+
| customer| sku|auto_create| next_creates| n|
+----------+--------------------+-----------+--------------------+---+
|248274_ARC|J31/H01N2-D35MM2-...| Y| [Y, Y, Y]| 3|
|248274_ARC|J31/H01N2-D35MM2-...| Y| [Y, Y, Y]| 3|
|248274_ARC|J31/H01N2-D35MM2-...| Y| [Y, Y, Y]| 3|
|297945_ARC| F87/012V55WH31EX10| Y| [Y, Y, Y, Y]| 4|
|297945_ARC| F87/012V55WH31EX10| Y| [Y, Y, Y, Y]| 4|
|297945_ARC| F87/012V55WH31EX10| Y| [Y, Y, Y, Y]| 4|
|297945_ARC| F87/012V55WH31EX10| Y| [Y, Y, Y, Y]| 4|
|318725_ARC| 605/85524V| N| [N, N, N]| 3|
|318725_ARC| 605/85524V| N| [N, N, N]| 3|
|318725_ARC| 605/85524V| N| [N, N, N]| 3|
|403787_ARC| BPC/77/9601-136| N| [N, N, N, Y, Y, Y]| 6|
|403787_ARC| BPC/77/9601-136| N| [N, N, N, Y, Y, Y]| 6|
|403787_ARC| BPC/77/9601-136| N| [N, N, N, Y, Y, Y]| 6|
|403787_ARC| BPC/77/9601-136| Y| [N, N, N, Y, Y, Y]| 6|
|403787_ARC| BPC/77/9601-136| Y| [N, N, N, Y, Y, Y]| 6|
|403787_ARC| BPC/77/9601-136| Y| [N, N, N, Y, Y, Y]| 6|
|434238_ARC| BB8/40300142| Y| [Y, Y, Y, Y]| 4|
|434238_ARC| BB8/40300142| Y| [Y, Y, Y, Y]| 4|
|434238_ARC| BB8/40300142| Y| [Y, Y, Y, Y]| 4|
|434238_ARC| BB8/40300142| Y| [Y, Y, Y, Y]| 4|
+----------+--------------------+-----------+--------------------+---+
и я хочу этот вывод:
+----------+--------------------+-----------+--------------------+---+
| customer| sku|auto_create| next_creates| n|
+----------+--------------------+-----------+--------------------+---+
|248274_ARC|J31/H01N2-D35MM2-...| Y| [Y, Y, Y]| 3|
|248274_ARC|J31/H01N2-D35MM2-...| Y| [Y, Y]| 3|
|248274_ARC|J31/H01N2-D35MM2-...| Y| [Y]| 3|
|297945_ARC| F87/012V55WH31EX10| Y| [Y, Y, Y, Y]| 4|
|297945_ARC| F87/012V55WH31EX10| Y| [Y, Y, Y]| 4|
|297945_ARC| F87/012V55WH31EX10| Y| [Y, Y]| 4|
|297945_ARC| F87/012V55WH31EX10| Y| [Y]| 4|
|318725_ARC| 605/85524V| N| [N, N, N]| 3|
|318725_ARC| 605/85524V| N| [N, N]| 3|
|318725_ARC| 605/85524V| N| [N]| 3|
|403787_ARC| BPC/77/9601-136| N| [N, N, N, Y, Y, Y]| 6|
|403787_ARC| BPC/77/9601-136| N| [N, N, Y, Y, Y]| 6|
|403787_ARC| BPC/77/9601-136| N| [N, Y, Y, Y]| 6|
|403787_ARC| BPC/77/9601-136| Y| [Y, Y, Y]| 6|
|403787_ARC| BPC/77/9601-136| Y| [Y, Y]| 6|
|403787_ARC| BPC/77/9601-136| Y| [Y]| 6|
|434238_ARC| BB8/40300142| Y| [Y, Y, Y, Y]| 4|
|434238_ARC| BB8/40300142| Y| [Y, Y, Y]| 4|
|434238_ARC| BB8/40300142| Y| [Y, Y]| 4|
|434238_ARC| BB8/40300142| Y| [Y]| 4|
+----------+--------------------+-----------+--------------------+---+
Я использую следующий код:
w = \
Window.partitionBy('customer','sku').orderBy('customer','sku')
analysis = analysis \
.withColumn('next_creates', collect_list('auto_create').over(w))
Предложение из ответов, которые выдавали ошибку при попытке присоединиться:
analysis = analysis.withColumn('rownumber',row_number().over(w).alias('rownumber'))
df1 = analysis
df2 = analysis
df1.join(df2, (df1.customer == df2.customer) & (df1.sku == df2.sku) & (df1.rownumber <= df2.rownumber)).groupBy('customer', 'sku').agg(collect_list('auto_create'))