我有一个如下所示的 Spark 数据框。 (只是一个例子。我的真实数据有数百万行):
df = pd.DataFrame({'ZIP1': ['50069', '50069', '50704', '50704', '52403', '52403'],
'ZIP2': ['50704', '52403', '50069', '52403', '50069', '50704'],
'STATE': ['IA', 'IA', 'IA', 'IA', 'IA', 'IA'],
'REGION': ['MIDWEST', 'MIDWEST', 'MIDWEST', 'MIDWEST', 'MIDWEST', 'MIDWEST'] } )
sdf = spark.createDataFrame(df)
ZIP1 ZIP2 STATE REGION
0 50069 50704 IA MIDWEST
1 50069 52403 IA MIDWEST
2 50704 50069 IA MIDWEST
3 50704 52403 IA MIDWEST
4 52403 50069 IA MIDWEST
5 52403 50704 IA MIDWEST
如果 ZIP1
和 ZIP2
列中的两个邮政编码是相同的组合,我需要删除一行。例如,row 0
和 row 2
,邮政编码只是相同的组合,但顺序相反。我需要删除 row 0
或 row 2
。同样,删除行 1
或 行 4
....
有谁知道如何在 pyspark 中实现这一点?需要 Pyspark 解决方案。如果有人可以同时提供 pyspark 和 python 的解决方案,那就更好了。谢谢!
最佳答案
Pandas 解决方案
cols = ['ZIP1', 'ZIP2']
df[cols] = np.sort(df[cols], axis=1)
df.drop_duplicates(subset=cols)
结果
ZIP1 ZIP2 STATE REGION
0 50069 50704 IA MIDWEST
1 50069 52403 IA MIDWEST
3 50704 52403 IA MIDWEST
Pyspark 解决方案
cols = ['ZIP1', 'ZIP2']
sdf.withColumn('arr', F.array_sort(F.array(*cols))).drop_duplicates(['arr']).drop('arr')
结果
| ZIP1| ZIP2|STATE| REGION|
+-----+-----+-----+-------+
|50069|50704| IA|MIDWEST|
|50069|52403| IA|MIDWEST|
|50704|52403| IA|MIDWEST|
+-----+-----+-----+-------+
在这两种解决方案中,主要思想都是对 ZIP1
和 ZIP2
列中的值进行排序,然后根据排序值删除重复项
关于python - 当 pyspark 中两列的值是相同组合时删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72926144/