python - 如何:Pyspark 数据帧持久使用和回读
问题描述
我对 pyspark 很陌生,我遇到以下错误:
Py4JJavaError: An error occurred while calling o517.showString.
我读过这是由于内存不足:Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
所以,我一直在读到这种情况的转机是使用df.persist()
和然后再次阅读持久化的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 ram)上运行;Windows 7的; 爪哇 8; 蟒蛇3.7.1;pyspark v2.4.3
解决方案
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 应用程序运行提供的驱动程序内存较少的结果。
推荐阅读
- dialogflow-es - Pepper Host/Chat 的帐户是什么?
- .net - 尝试在 .Net 中安装软件包时出错
- reactjs - 按钮点击反应导航到其他页面
- c# - 我无法将 pos 打印机添加到 posdm(configuration.xml 或命令行 adddevice)
- php - 如何在此 PHP 数组中获取特定值?
- ios - Xcode 11中呈现的ViewController内部的CollectionViewCell扭曲了单元格大小
- asp.net-mvc - razor 中的字符串变量如何成为 java 脚本中的 html 元素
- sqlite - 为什么我的 SQLite 数据库在我关闭应用程序之前不添加数据?
- reactjs - 如何使用 React 创建一个可以实时预览小部件并生成小部件可嵌入链接的门户
- c# - 在工作共享云模型上手动重新生成 Revit API