создать новый фрейм данных, найдя в pyspark замененный идентификатор - PullRequest
0 голосов
/ 11 июня 2018

У меня есть фрейм данных, подобный следующему:

df = spark.createDataFrame([(0, "departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Pink","departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue"), (1, "departmentcode__10~#~p99189h8pk0__10484~#~prod_productcolor__Dustysalmon Black","departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue"), (2, "departmentcode__60~#~p99189h8pk0__10485~#~prod_productcolor__Dustysalmon White","departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue"), (3, "departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue","departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Pink")], ["id", "left", "right"])

Мне нужно создать новый фрейм данных, подобный следующему:

Здесь для идентификаторов 0 и 3 слева и справа поменялись местами,в этом случае мне нужно создать новый столбец с именем new_id, где new_id - альтернативный идентификатор.(для идентификатора 0 это 3, а для идентификатора 3 new_id равно 0. для остальных это нулевое значение (если совпадение не найдено))

------------------+
|id |left|right |new_id
-+-----------------------------------------------------------------------------+
|0     |departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Pink     |departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue|3
|1  |departmentcode__10~#~p99189h8pk0__10484~#~prod_productcolor__Dustysalmon Black|departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue|null
|2  |departmentcode__60~#~p99189h8pk0__10485~#~prod_productcolor__Dustysalmon White|departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue|null
|3  |departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue |departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Pink|0

1 Ответ

0 голосов
/ 11 июня 2018

Все, что вам нужно, это левое самостоятельное соединение , но со следующим условием

from pyspark.sql import functions as f
df.alias('df1').join(df.alias('df2'), on=((f.col('df1.left') == f.col('df2.right')) & (f.col('df1.right') == f.col('df2.left'))), how='left')\
    .select(f.col('df1.id'), f.col('df1.left'), f.col('df1.right'), f.col('df2.id').alias('new_id'))\
    .show(truncate=False)

, которое должно дать вам

+---+------------------------------------------------------------------------------+-----------------------------------------------------------------------------+------+
|id |left                                                                          |right                                                                        |new_id|
+---+------------------------------------------------------------------------------+-----------------------------------------------------------------------------+------+
|2  |departmentcode__60~#~p99189h8pk0__10485~#~prod_productcolor__Dustysalmon White|departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue|null  |
|0  |departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Pink |departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue|3     |
|3  |departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue |departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Pink|0     |
|1  |departmentcode__10~#~p99189h8pk0__10484~#~prod_productcolor__Dustysalmon Black|departmentcode__50~#~p99189h8pk0__10483~#~prod_productcolor__Dustysalmon Blue|null  |
+---+------------------------------------------------------------------------------+-----------------------------------------------------------------------------+------+

Надеюсь, ответ полезен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...