首页 > 解决方案 > pyspark 在数据框中删除行以在一列中只有 X 个不同的值

问题描述

所以我有一个带有“类别”列的数据框,它有超过 12k 个不同的值,出于抽样目的,我想获得一个小样本,其中该类别列只有 1000 个不同的值。

在我做之前:

small_distinct = df.select("category").distinct().limit(1000).rdd.flatMap(lambda x: x).collect()
df = df.where(col("category").isin(small_distinct))

我知道这是非常低效的,因为我正在对类别列进行区分,然后将其转换为普通的 python 列表,以便我可以使用isin()过滤器。

有没有这样做的“火花”方式?我想也许带有rolloverwindows的东西可以完成这项工作?但我无法解决它

谢谢!

标签: pythonapache-sparkpyspark

解决方案


您可以使用 left_semi 连接改进您的代码:

small_distinct = df.select("category").distinct().limit(1000)
df = df.join(small_distinct, "category", "left_semi")

使用 left_semi 是一种使用另一个表过滤表的好方法,保持相同的模式,以一种有效的方式。


推荐阅读