首页 > 解决方案 > Pyspark GroupBy 和计数太慢

问题描述

我在具有 4 个节点的 dataproc 集群上运行 pyspark,每个节点有 2 个内核和 8 GB RAM。我有一个数据框,其中有一列包含单词列表。我爆炸了这个专栏并计算了出现的次数——

df.groupBy("exploded_col").count()

在爆炸之前,大约有 7800 万行。但是,运行上述代码需要的时间太长(超过 4 小时)。为什么火花需要异常长的时间?我还是新手,所以我不完全了解处理大量数据的适当设置。

我对 sparkContext 有以下设置

enter code here
SparkSession.builder \
    .appName("Spark NLP Licensed") \
    .master("yarn") \
    .config("spark.jars.packages", "com.johnsnowlabs.nlp:spark-nlp_2.11:2.5.1") 
spark.conf.set("spark.sql.shuffle.partitions",20)
spark.conf.set("spark.num.executors",100)
spark.conf.set("spark.executor.cores",1)
spark.conf.set("spark.sql.files.ignoreCorruptFiles", "true")

我什至将“spark.sql.shuffle.partitions”设置为 2001,但这也不起作用。请帮忙。

标签: apache-sparkpysparkgroup-bygoogle-cloud-dataproc

解决方案


性能不佳的主要原因是 groupBy 通常会导致 executor 之间的数据 shuffle。您可以通过这种方式使用内置的 spark 功能countDistinct

from spark.sql.functions import countDistinct
df.agg(countDistinct("exploded_col"))

推荐阅读