我想使用 pyspark 提高应用程序的性能。
数据框是这样的:每列代表用户 XXX 对问题 XXX 发表的评论。
+-----------+--------------+----------+
|user_id | comment_id |question_id|
+-----------+--------------+----------+
| 10181831|R2OX4JVN03FOMT|6302014700|
| 51697036|R1R4GTQCO51GC0|B0000001NY|
现在我想删除发表评论数少于 1 条的用户发表的评论以及收到评论数少于 3 条的问题的评论
我的代码是这样的:
window_u = Window.partitionBy("user_id")
window_p = Window.partitionBy("question_id")
reviews = reviews.withColumn("n",
count("user_id").over(window_u)).filter("n >= 1").drop("n")
reviews = reviews.withColumn("n",
count("question_id").over(window_p)).filter("n >= 3").drop("n")
问题是现在这个应用程序运行速度非常慢,因为我有一个非常大的数据集。提高性能有什么问题吗?
最佳答案
您可以直接过滤掉少于1条记录的空记录,然后运行分区查询,这肯定会比两个分区查询运行得更快,并且您的查询中有一个错误我认为您想要计算comment_id而不是Question_id
import pyspark.sql.functions as F
from pyspark.sql import Window
window_p = Window.partitionBy("question_id")
reviews = reviews.filter(
F.col("comment_id).isNotNull()
).withColumn(
"n",
F.count("comment_id").over(window_p)
).filter("n >= 3").drop("n")
或者可以先过滤掉空记录后再进行groupby操作
reviews.filter(
F.col("comment_id).isNotNull()
).groupby(
"question_id",
F.count("comment_id").alias("n")
).filter("n >= 3").drop("n")
这比分区运行得更快,但如果您需要所有列,则必须再次将其与主表连接
关于python - 提高我的 pyspark 数据过滤程序的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56163697/