在 PySpark 中获取具有重复值的组

Get groups with duplicated values in PySpark

例如,如果我们有以下数据框:

df = spark.createDataFrame([['a', 1], ['a', 1],
                            ['b', 1], ['b', 2],
                            ['c', 2], ['c', 2], ['c', 2]],
                            ['col1', 'col2'])

+----+----+
|col1|col2|
+----+----+
|   a|   1|
|   a|   1|
|   b|   1|
|   b|   2|
|   c|   2|
|   c|   2|
|   c|   2|
+----+----+

我想根据 col1 标记组,其中 col2 中的值重复。我想找到组大小和不同值计数之间的差异:

window = Window.partitionBy('col1')
df.withColumn('col3', F.count('col2').over(window)).\
withColumn('col4', F.approx_count_distinct('col2').over(window)).\
select('col1', 'col2', (F.col('col3') - F.col('col4')).alias('col3')).show()

也许你有更好的解决办法。我的预期输出:

+----+----+----+
|col1|col2|col3|
+----+----+----+
|   a|   1|   1|
|   a|   1|   1|
|   b|   1|   0|
|   b|   2|   0|
|   c|   2|   2|
|   c|   2|   2|
|   c|   2|   2|
+----+----+----+

如您所见,col3 等于零的所有组在 col2 中只有唯一值。

根据自己的需要,可以考虑按照col1col2进行分组统计。

df = df.withColumn('col3', F.expr('count(*) over (partition by col1,col2) - 1'))
df.show(truncate=False)