python - 提高我的 pyspark 数据过滤程序的性能

标签 python pyspark

我想使用 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/

相关文章:

python - 连续行之间的日期差异 - Pyspark Dataframe

python - 如何在 pyspark DataFrame 上下文中调用 aes_encrypt (和其他 Spark SQL 函数)

Python/Pyside 崩溃但没有错误信息

c# - 从 C# 调用 Python 应用程序/脚本

python - 属性错误: 'module' object has no attribute 'Graph'

apache-spark - 如何删除或覆盖添加到 pyspark 作业的文件?

pandas - MultiIndex Pandas DataFrame 到 Spark DataFrame 和缺失索引

Python:打印为每个键分配多个值的字典元素

python - 从 pyodbc 读取数据到 pandas

apache-spark - spark - 计算 2 列或更多列中值的平均值并在每一行中放入新列