如何:Pyspark 数据帧持久使用和回读

Posted

技术标签:

【中文标题】如何:Pyspark 数据帧持久使用和回读【英文标题】:How to: Pyspark dataframe persist usage and reading-back 【发布时间】:2019-10-15 14:06:50 【问题描述】:

我对 pyspark 很陌生,我遇到以下错误:Py4JJavaError: An error occurred while calling o517.showString. 我读到这是由于内存不足:Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded 所以,我一直在读到这种情况的转机是使用df.persist(),然后再次阅读 persisted df,所以我想知道:

给定一个for 循环,我在其中执行一些.join 操作,我应该在循环内部还是在循环末尾使用.persist()?例如
for col in columns:
   df_AA = df_AA.join(df_B, df_AA[col] == 'some_value', 'outer').persist()

--> or <--

for col in columns:
   df_AA = df_AA.join(df_B, df_AA[col] == 'some_value', 'outer')
df_AA.persist()
完成后,我应该如何回读? df_AA.unpersist()? sqlContext.read.some_thing(df_AA)?

我对此真的很陌生,所以请尽量解释清楚。我正在使用 jupyter-notebooks(anaconda) 的本地机器(8GB 内存)上运行; Windows 7的;爪哇 8;蟒蛇3.7.1; pyspark v2.4.3

【问题讨论】:

【参考方案1】:

Spark 是惰性评估框架,因此,在您调用 action 之前,不会调用任何 转换,例如:join。

所以继续你所做的事情

from pyspark import StorageLevel
    for col in columns:
       df_AA = df_AA.join(df_B, df_AA[col] == 'some_value', 'outer')
    df_AA.persist(StorageLevel.MEMORY_AND_DISK)
    df_AA.show()

有多个持久化选项可用,因此选择 MEMORY_AND_DISK 会将内存中无法处理的数据溢出到 DISK。

GC 错误也可能是由于为 Spark 应用程序运行提供的 DRIVER 内存较少。

【讨论】:

谢谢乔比,那么回读呢,我该如何管理呢?我应该使用函数吗?还是只是在某些操作中再次使用数据框名称?即 df_AA.select('some_col')...etc 等 @Mike 回读意味着您想从数据框中选择一些特定的列,如果是,那么您在评论中提到的内容是正确的df.select(&lt;columns_list comma separated&gt;) 例如:df.select('col1', 'col2') 要查看数据框中的数据,您必须使用df.show() 默认它只显示20行。

以上是关于如何:Pyspark 数据帧持久使用和回读的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark中组连接函数的持久循环数据帧

当指定存储级别时,在 pyspark2 中持久化数据帧不起作用。我究竟做错了啥?

pyspark 行列表的 RDD 到 DataFrame

Pyspark:需要了解pyspark中缓存的行为

Pyspark - 如何将多个数据帧的列连接成一个数据帧的列

PySpark数据框显示错误的值