monotonically_increasing_id больше, чем общее количество записей в кадре данных - PullRequest
0 голосов
/ 06 января 2020

У меня есть код 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

1 Ответ

1 голос
/ 06 января 2020

Привет, проверьте это для более.

В соответствии с документацией для monotonically_increasing_id.

Сгенерированный идентификатор гарантированно будет монотонно увеличиваться и уникален, но не подряд. Текущая реализация помещает идентификатор раздела в верхние 31 бит, а номер записи в каждом разделе - в младшие 33 бита. Предполагается, что во фрейме данных менее 1 миллиарда разделов, а в каждом разделе менее 8 миллиардов записей.

вам нужно что-то вроде

from pyspark.sql.window import Window 
from pyspark.sql import functions as 

df2 = df1.withColumn("id", fun.monotonically_increasing_id())

windowSpec = Window.orderBy("idx")

df2.withColumn("id", fun.row_number().over(windowSpec)).show()

+-----+---+
|value|id |
+-----+---+
|    1|  1|
|    3|  2|
|    9|  3|
|   13|  4|
+-----+---+

Это создаст нужный вам тип идентификатора.

...