apache-spark - 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,但这也不起作用。请帮忙。
解决方案
性能不佳的主要原因是 groupBy 通常会导致 executor 之间的数据 shuffle。您可以通过这种方式使用内置的 spark 功能countDistinct
:
from spark.sql.functions import countDistinct
df.agg(countDistinct("exploded_col"))
推荐阅读
- c - 如何将文件中的数据转换为C中的结构?
- excel - 在 VBA 代码中,如何使用每个单元格方法将值添加到列表框并定义范围 End(XlDown)?
- linux - 如何验证我的 cron 作业将在 AWS 上使用 Ubuntu 运行?
- r - 如何在 R plotly chloropleth maps 中使用非默认色标?
- javascript - 当有很多物体时如何进行碰撞检测(JavaScript)
- python - 在示例中使用 Windows Anaconda 先决条件训练 Faster R-CNN 或 Mask R-CNN
- vb.net - 从 DataGridView vb 中检索 ComboBox 项。网
- java - 如何将文件中的字符串转换为数组?
- python - 为什么 HoughCircles 会检测到错误的圆圈?
- three.js - 抖动顶点