PySpark:筛选出列值在数据框中多次出现的行

时间:2019-02-21 20:21:36

标签: python pyspark

鉴于PySpark数据框有两列,我想将数据集分成两个数据框:一个在其中ColA和ColB的组合是唯一的,另一个在其中是不唯一的。

例如:

ColA | ColB | ColCDoesntMatter
1    | 2    | 4
1    | 3    | 3
2    | 2    | 2
1    | 2    | 6
2    | 2    | 8
2    | 3    | 9

唯一的A / B配对是:

1-3
2-3

非唯一A / B配对为:

1-2
2-2

因此,一个数据帧将使所有行具有唯一的AB值,而另一行将包含非唯一的AB值。 ColC对于过滤器无关紧要,但需要保留。如何运行此过滤器?

编辑:请注意,我不能使用dropDuplicates,因为它实际上是A和B的组合需要唯一,而不仅仅是A或B。

1 个答案:

答案 0 :(得分:2)

# count rows per A-B
dfWithRowCount = df.selectExpr("*", "count('*') over (partition by (ColA, ColB)) as nrows")

# filter
uniqueAB = dfWithRowCount.filter(dfWithRowCount.nrows == 1).drop('nrows')
nonUniqueAB = dfWithRowCount.filter(dfWithRowCount.nrows > 1).drop('nrows')

nonUniqueAB.show()
+----+----+----+
|ColA|ColB|ColC|
+----+----+----+
|   2|   2|   2|
|   2|   2|   8|
|   1|   2|   4|
|   1|   2|   6|
+----+----+----+

uniqueAB.show()
+----+----+----+
|ColA|ColB|ColC|
+----+----+----+
|   1|   3|   3|
|   2|   3|   9|
+----+----+----+