python - 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的东西可以完成这项工作?但我无法解决它
谢谢!
解决方案
您可以使用 left_semi 连接改进您的代码:
small_distinct = df.select("category").distinct().limit(1000)
df = df.join(small_distinct, "category", "left_semi")
使用 left_semi 是一种使用另一个表过滤表的好方法,保持相同的模式,以一种有效的方式。
推荐阅读
- r - 使用 MLE 方法估计指数分布的 lambda
- azure - 将构建文件夹发布到 wwwroot 后,Web 应用程序未更新
- spring-data-jpa - 如何防止 Spring 子类化实现存储库接口的类?
- r - 使用 dplyr 重新采样和循环不起作用
- python - 尝试在按钮提交上调用 Django 视图并重定向到同一页面(重新加载)
- macos - 使用 AppleScript 和 Finder 转换图像
- node.js - 如何防止 webpack 捆绑 node_modules 文件夹 [ Webpack 4.40.2 ]
- git - 如何通过 branchName 安装 repo 并在安装时构建它?
- mongodb - 为什么我的 req.user 没有保存在旧版 Chrome 上?
- reactjs - 主机对现有 nginx 单独目录上的静态文件做出反应