为什么 20 行 PySpark 数据帧上的 .show() 这么慢?

use*_*916 6 hive apache-spark apache-spark-sql pyspark

我在 Jupyter 笔记本中使用 PySpark。以下步骤最多需要 100 秒,这是可以的。

toydf = df.select("column_A").limit(20)
Run Code Online (Sandbox Code Playgroud)

但是,接下来的show()步骤需要 2-3 分钟。它只有 20 行整数列表,每个列表不超过 60 个元素。为什么需要这么长时间?

toydf.show()
Run Code Online (Sandbox Code Playgroud)

df 生成如下:

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

cod*_*oni 2

Spark中有两个主要概念:

1:转换:每当您应用 withColumn、drop、joins 或 groupBy 时,它们实际上是在评估,它们只是生成一个新的数据帧或 RDD。

2:动作:在诸如计数、显示、显示等动作的情况下,编写它实际上完成所有转换工作。所有这些操作都在内部调用 Spark RunJob API 将所有转换作为作业运行。

在你的情况下,当你击中时toydf = df.select("column_A").limit(20)什么也没有发生。

但是,当您使用Show()作为操作的方法时,它会将数据从集群收集到您的驱动程序节点,此时它实际上评估您的toydf = df.select("column_A").limit(20).