У меня есть код Pyspark ниже. Я пытаюсь создать новый match_id, который последовательно увеличивается. Старый match_id был случайным уникальным значением. Match_id указывает на совпадающие пары товаров в данных. Поэтому я сортирую исходные данные по идентификатору. Может быть несколько идентификаторов, соответствующих одному match_id. Я беру первый идентификатор для каждого match_id. Затем сортировка меньшего информационного кадра первого идентификатора и match_id по идентификатору. Затем я создаю новый монотонно увеличивающийся идентификатор. Затем я присоединяюсь к исходному фрейму данных в match_id, чтобы получить исходный фрейм данных с новым монотонно увеличивающимся match_id. Проблема, с которой я сталкиваюсь, заключается в том, что новый match_id получает значения, превышающие количество записей в любом кадре данных. Как это может быть возможно? Разве new_match_id не должен просто равняться номеру строки из id_to_match_id плюс 1? Таким образом, самый большой new_match_id должен быть 377729? Может кто-нибудь объяснить, что вызывает эти большие new_match_id и предложить, как я могу правильно создать new_match_id?
код:
# partition by match_id and get first id
w2 = Window().partitionBy("match_id").orderBy(new_matched_df.id.asc())
id_to_match_id=new_matched_df\
.select(col("match_id"), first("id",True).over(w2).alias('id')).distinct()
# creating new match_id
from pyspark.sql.functions import monotonically_increasing_id
id_to_match_id=id_to_match_id.sort('id',ascending=True).withColumn('new_match_id',(monotonically_increasing_id()+1))
new_matched_df2=new_matched_df
# replacing old match_id with new match_id
new_matched_df2=new_matched_df2.alias('a')\
.join(id_to_match_id.alias('b'),
(col('a.match_id')==col('b.match_id')),
how='inner'
)\
.select(col('a.storeid'),
col('a.product_id'),
col('a.productname'),
col('a.productbrand'),
col('a.producttype'),
col('a.productsubtype'),
col('a.classification'),
col('a.weight'),
col('a.unitofmeasure'),
col('a.id'),
col('b.new_match_id').alias('match_id'))
id_to_match_id.sort('new_match_id',ascending=False).show()
print(new_matched_df2.count())
print(id_to_match_id.count())
Вывод:
+------------+------+-------------+
| match_id| id| new_match_id|
+------------+------+-------------+
|412316878198|864316|1709396985719|
|412316878188|864306|1709396985718|
|412316878183|864301|1709396985717|
|412316878182|864300|1709396985716|
|412316878181|864299|1709396985715|
|412316878178|864296|1709396985714|
|412316878177|864295|1709396985713|
|412316878175|864293|1709396985712|
|412316878174|864292|1709396985711|
|412316878169|864287|1709396985710|
|412316878160|864278|1709396985709|
|412316878156|864274|1709396985708|
|412316878154|864272|1709396985707|
|412316878149|864267|1709396985706|
|412316878148|864266|1709396985705|
|412316878146|864264|1709396985704|
|412316878145|864263|1709396985703|
|412316878143|864261|1709396985702|
|412316878136|864254|1709396985701|
|412316878135|864253|1709396985700|
+------------+------+-------------+
864302
377728