在 PySpark 中映射不同的 ID

Mapping different ids in PySpark

我有一个数据集想在 PySpark 中使用。一个 DF 的形式为:

+--------+----------------------------+
|artistid|artist_name                 |
+--------+----------------------------+
|1134999 |06Crazy Life                |
|6821360 |Pang Nakarin                |
|10113088|Terfel, Bartoli- Mozart: Don|
|10151459|The Flaming Sidebur         |
|6826647 |Bodenstandig 3000           |
+--------+----------------------------+

而且,正如上面的预览所示,一些艺术家的名字拼写错误,因此存在重复的艺术家但 ID 不同。

我还有另一个 DF,看起来像这样:

+--------+-------+
|badid   |goodid |
+--------+-------+
|1092764 |1000311|
|1095122 |1000557|
|6708070 |1007267|
|10088054|1042317|
|1195917 |1042317|
+--------+-------+

也就是说,它将前一个 DF 中的每个“坏 id”映射到一个“好 id”。

现在我想做的是:将第一个 DF 中的每个错误 ID 替换为第二个 DF 中对应的正确 ID。 我猜我必须做某种地图,但我以前从未在 PySpark 中使用过 .map。

在这种情况下,如何将一个 DF 中的值映射到另一个 DF 中的值?

用 2 个左连接来计算哪个好 ID 映射到哪个坏 ID 怎么样?

df1
df1 = spark.createDataFrame([
    (1134999, '06Crazy Life'),
    (6821360, 'Pang Nakarin'),
    (10113088, 'Terfel, Bartoli- Mozart: Don'),
    (10151459, 'The Flaming Sidebur'),
    (6826647, 'Bodenstandig 3000'),
    (11223344, 'Crazy Life'),
], ['artistid', 'artist_name'])
df2
df2 = spark.createDataFrame([
    (1092764, 1000311),
    (1095122, 1000557),
    (6708070, 1007267),
    (10088054, 1042317),
    (1195917, 1042317),
    (1134999, 11223344),
], ['badid', 'goodid'])
算好艺人名字
(df1
    .alias('a1')
    .join(df2.alias('id'), on=[F.col('a1.artistid') == F.col('id.badid')], how='left')
    .join(df1.alias('a2'), on=[F.col('a2.artistid') == F.col('id.goodid')], how='left')
    .show()
)

+--------+--------------------+-------+--------+--------+-----------+
|artistid|         artist_name|  badid|  goodid|artistid|artist_name|
+--------+--------------------+-------+--------+--------+-----------+
| 6821360|        Pang Nakarin|   null|    null|    null|       null|
| 6826647|   Bodenstandig 3000|   null|    null|    null|       null|
|10113088|Terfel, Bartoli- ...|   null|    null|    null|       null|
|10151459| The Flaming Sidebur|   null|    null|    null|       null|
|11223344|          Crazy Life|   null|    null|    null|       null|
| 1134999|        06Crazy Life|1134999|11223344|11223344| Crazy Life|
+--------+--------------------+-------+--------+--------+-----------+