Spark UI中'showString'是什么?两段代码为何性能差异悬殊?
Spark UI中
showString的含义及两段代码的差异分析 一、Spark UI里的showString是什么?
showString是Spark DataFrame的show()方法底层调用的核心方法,负责将DataFrame的内容格式化为可读字符串并输出到控制台。在Spark UI的Stage中显示这个标识,说明该Stage的任务是为执行show()操作做准备——收集需要展示的数据(默认前20行)并完成格式化的前置计算。
二、两段代码的差异及性能差距原因
两段代码的本质差异
先明确两段代码的执行逻辑:
- 代码(1):
df.createOrReplaceTempView("dftable") sqldf = spark.sql('SELECT COUNT(*) FROM dftable') sqldf.show()
通过SQL语句SELECT COUNT(*)执行聚合查询,得到仅包含一行计数结果的DataFrame,再调用show()将结果输出到控制台。
- 代码(2):
df.createOrReplaceTempView("dftable") sqldf = spark.sql('SELECT * FROM dftable') sqldf.count()
通过SQL语句SELECT *获取全量数据的DataFrame,再调用DataFrame内置的count()方法计算总行数。
性能差距的核心原因
两者看似都是计算总行数,但执行路径和Spark的优化逻辑完全不同,导致耗时差异:
- 执行计划的优化程度不同
- 代码(1)的
SELECT COUNT(*)是SQL聚合查询,Spark会按照SQL执行计划处理:如果数据分布在多个分区,需要通过Shuffle操作将各分区的计数结果汇总到一起,才能得到全局总数,Shuffle会带来大量网络IO和磁盘IO开销。 - 代码(2)的
count()是DataFrame的内置Action操作,Spark对其有专门的轻量优化:每个Executor会先在本地对自己负责的分区计数,仅将分区的计数结果(而非全量数据)发送到Driver端汇总,不需要执行全量Shuffle,计算开销大幅降低。
- 代码(1)的
- 额外操作的开销差异
代码(1)的show()需要将查询结果拉到Driver端,再进行字符串格式化和控制台输出,这部分开销叠加Shuffle的耗时后,整体耗时被放大;而代码(2)的count()仅返回一个数值,没有额外的格式化和输出步骤。
内容的提问来源于stack exchange,提问作者taci
相关产品推荐
相关产品推荐

