【问题标题】:Deep copy a filtered PySpark dataframe from a Hive query从 Hive 查询中深度复制过滤的 PySpark 数据帧
【发布时间】:2016-05-20 00:47:46
【问题描述】:

我从 Hive 表中获取一些数据并插入数据框:

df = sqlContext.table('mydb.mytable')

我正在过滤一些无用的值:

df = df[df.myfield != "BADVALUE"]

出于代码设计原因,我想在数据框上执行此操作,而不是作为 select 查询。我注意到,即使在我过滤了数据帧之后,似乎每次我在 df 上操作时都会执行来自 Hive 的查询和加载操作:

df.groupBy('myfield').mean()

这需要很长时间,就像我没有过滤数据框一样。有没有办法对其进行深拷贝以提高性能并减少内存占用?

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    听起来您需要缓存数据帧

    df.cache()
    

    Spark 被延迟评估。当您执行转换(例如过滤器)时,spark 实际上不会做任何事情。在您执行操作(例如显示、计数等)之前,不会发生计算。 Spark 不会保留任何中间(最终)结果。它只保留创建所有数据框所需的步骤。如果您执行多个操作,为了避免多个冗余步骤(例如读取表、过滤掉错误值),您需要将中间数据帧缓存到内存中。

    【讨论】:

    • 缓存。代码显示它返回self,但似乎它标记了类上的一个属性,表明它已被缓存。
    • 是的,它实际上只是更新了数据帧的一些元数据,而没有实际缓存它。然后,当对数据帧或从缓存的数据帧派生的数据帧执行操作时,数据将被读取并存储在内存中。本网站上的 4 和 5 对其进行了更多解释:。该示例使用 RDD,但与数据帧相同。 ampcamp.berkeley.edu/3/exercises/…
    猜你喜欢
    • 2017-03-16
    • 2021-04-10
    • 2017-10-21
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多