Как: данные Pyspark сохраняют использование и повторное чтение - PullRequest
0 голосов
/ 15 октября 2019

Я новичок в 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)?

Я действительно новичок в этом, поэтому, пожалуйста, постарайтесь объяснить как можно лучше.

Я работаю на локальной машине (8 ГБ оперативной памяти), используя jupyter-ноутбуки (анаконды);Windows 7;Ява 8;Python 3.7.1;pyspark v2.4.3

1 Ответ

1 голос
/ 16 октября 2019

Spark - это вычисляемый ленивый фреймворк, поэтому ни одно из преобразований , например: join, не вызывается до тех пор, пока вы не вызовете 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 могут быть результатом меньшего объема памяти DRIVER, предоставленной для запуска Spark Application.

...