在 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|
+--------+--------------------+-------+--------+--------+-----------+
我有一个数据集想在 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|
+--------+--------------------+-------+--------+--------+-----------+