为什么在一个有20行的PySpark数据框上使用.show()方法会很慢?

8
我正在Jupyter笔记本中使用PySpark。下一步骤需要100秒钟左右的时间,这是可以接受的。
toydf = df.select("column_A").limit(20)

然而,以下的show()步骤需要2-3分钟的时间。它只有20行整数列表,并且每个列表中的元素不超过60个。为什么会这么慢呢?

toydf.show()

df是按以下方式生成的:

spark = SparkSession.builder\
    .config(conf=conf)\
    .enableHiveSupport()\
    .getOrCreate()
df = spark.sql("""SELECT column_A
                        FROM datascience.email_aac1_pid_enl_pid_1702""")

df 是如何生成的?这里唯一实际读取任何数据的方法是 show()... 注意:大多数应用程序要么是 CPU 绑定,要么是网络绑定,但只有在数据存储在内存中后才会出现这种情况。 - OneCricketeer
@cricket_007 已更新。我原以为 df = spark.sql(. . .) 会将数据加载/流式传输到内存中? - user2205916
1
不是的。据我所知,它只是加载元数据。 - OneCricketeer
这很奇怪。我会说这可能是网络瓶颈,因为它需要从执行器加载数据。解决问题的一个不太优雅的方法是缓存toydf。因此,第一次显示会很慢,但之后应该会加载到内存中。 - Dat Tran
1个回答

2
在Spark中有两个主要的概念:
1:转换(Transformations):每当您应用withColumn、drop、joins或groupBy时,它们实际上是在评估,它们只会生成一个新的dataframe或RDD。
2:操作(Actions):而在动作方面,例如count、show、display、write,它实际上完成了所有转换的工作。并且所有这些操作内部都调用了Spark RunJob API来运行所有转换作业。
在您的情况下,当您执行toydf = df.select("column_A").limit(20)时,什么也没有发生。
但是当您使用Show()方法时,它是一个操作,因此它将从集群收集数据到您的Driver节点,并在此期间实际评估了toydf = df.select("column_A").limit(20)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接