作法:Pyspark资料框持续使用和回读

时间:2019-10-15 14:06:50

标签: python dataframe caching pyspark persist

我是pyspark的新手,出现以下错误:

Py4JJavaError: An error occurred while calling o517.showString.,并且我读到这是由于内存不足:
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded

因此,我一直在阅读这种情况的解决方法是使用df.persist(),然后再次阅读 persisted df,所以我想知道:
< / p>

  • 给定一个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的; Java 8; python 3.7.1; pyspark v2.4.3

1 个答案:

答案 0 :(得分:1)

Spark是一种惰性评估框架,因此,在调用 action 之前,不会调用任何转换

所以继续做吧

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应用程序运行时提供的驱动器内存减少所致。