【问题标题】:Why is .show() on a 20 row PySpark dataframe so slow?为什么 20 行 PySpark 数据帧上的 .show() 这么慢?
【发布时间】:2017-12-14 19:10:12
【问题描述】:

我在 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 限制,要么受网络限制,但只有在数据被在记忆中
  • @cricket_007 已更新。我认为 df = spark.sql(. . .) 可能会将数据加载/流式传输到内存中?
  • 不。它只是加载元数据(据我所知)
  • 这很奇怪。我会说这可能是网络瓶颈,因为它需要从您的执行程序加载数据。解决该问题的一种肮脏解决方案是缓存 toydf。所以第一个节目会很慢,但之后应该加载到内存中。

标签: apache-spark hive pyspark apache-spark-sql


【解决方案1】:

在spark中有两个主要概念:

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

2:动作:如果是计数、显示、显示等动作,写它实际上完成了所有的转换工作。而这所有的 Actions 在内部调用 Spark RunJob API 以将所有转换作为 Job 运行。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2017-01-04
    • 2013-09-19
    • 2012-12-26
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多