Apache spark Pyspark GroupBy和计数太慢

Apache spark Pyspark GroupBy和计数太慢,apache-spark,pyspark,group-by,google-cloud-dataproc,Apache Spark,Pyspark,Group By,Google Cloud Dataproc,我在dataproc集群上运行pyspark,它有4个节点,每个节点有2个内核和8 GB RAM。 我有一个数据框,其中有一列包含单词列表。我将此列分解,并使用- df.groupBy("exploded_col").count() 爆炸前,约有78MN排。 但是,运行上述代码花费的时间太长(超过4小时)。为什么spark要花很长时间?我对spark还是个新手,所以我并不完全了解处理海量数据的适当设置 我对sparkContext有以下设置 enter code here

我在dataproc集群上运行pyspark,它有4个节点,每个节点有2个内核和8 GB RAM。 我有一个数据框,其中有一列包含单词列表。我将此列分解,并使用-

df.groupBy("exploded_col").count()
爆炸前,约有78MN排。 但是,运行上述代码花费的时间太长(超过4小时)。为什么spark要花很长时间?我对spark还是个新手,所以我并不完全了解处理海量数据的适当设置

我对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,但这也不起作用。
请帮助。

性能不佳的主要原因是groupBy通常会导致执行者之间的数据混乱。您可以通过以下方式使用内置火花功能
countDistinct

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

性能差的主要原因是groupBy通常会导致执行者之间的数据混乱。您可以通过以下方式使用内置火花功能
countDistinct

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

我认为问题是因为数据分布不正确。当您运行GROUPBY子句时,如果所有节点上都随机存在数据,那么将出现大量的混乱,我相信这就是您面临的问题。你能在Spark用户界面上看到吗?尝试进入阶段,看看节点上有多少混乱。我认为问题是因为数据分布不正确。当您运行GROUPBY子句时,如果所有节点上都随机存在数据,那么将出现大量的混乱,我相信这就是您面临的问题。你能在Spark用户界面上看到吗?试着走到舞台上,看看有多少人在等待回答。我尝试了countDistinct(),但也花了很长时间。您的数据大小是多少?集群的大小和配置是什么?在dataproc UI上,挂起的内存高达2.9 TB。集群中有4个节点,每个节点都是n1-standard2类型。这可能意味着集群太小,无法处理数据。它是哪种格式?如果它来自BigQuery、Parquet或类似内容,您可以只加载相关列,这将减少(取决于模式)数据的大小。如果没有帮助,请增加集群大小。我只处理3列,它是从.orc格式加载的。顺便说一句,我执行了count(),结果很快。我不能增加集群大小,所以spark配置(我在问题中分享了)中是否有任何可以改进处理的更改?谢谢回复。我尝试了countDistinct(),但也花了很长时间。您的数据大小是多少?集群的大小和配置是什么?在dataproc UI上,挂起的内存高达2.9 TB。集群中有4个节点,每个节点都是n1-standard2类型。这可能意味着集群太小,无法处理数据。它是哪种格式?如果它来自BigQuery、Parquet或类似内容,您可以只加载相关列,这将减少(取决于模式)数据的大小。如果没有帮助,请增加集群大小。我只处理3列,它是从.orc格式加载的。顺便说一句,我执行了count(),结果很快。我不能增加集群大小,所以spark配置(我在问题中分享了)中是否有任何可以改进处理的更改?