Как Паркет обрабатывает столбцы SparseVector? - PullRequest
0 голосов
/ 16 января 2019

Я очень новичок в PySpark. Я собирал tfidf и хочу сохранить его на диске в качестве промежуточного результата. Теперь оценка IDF дает мне представление SparseVector.

Однако, пытаясь сохранить его как паркет, я получаю OOM. Я не уверен, что он внутренне преобразует SparseVector в Dense, так как в этом случае он приведет к некоторым столбцам размером 25 тыс., И в соответствии с потоком этот сохранение таких больших данных в столбчатом формате может привести к OOM.

Итак, есть идеи, в чем может быть дело? У меня память исполнителя как 8g и я работаю с 2g CSV-файлом.

Стоит ли увеличить память или сохранить ее в CSV вместо Parquet? Любая помощь приветствуется. Заранее спасибо.

Обновление 1

Как указывалось, что Spark выполняет ленивую оценку, ошибка может быть из-за вышестоящей стадии, я пытался показать и собрать перед записью. Казалось, они работали нормально, не выбрасывая ошибок. Итак, это все еще какая-то проблема, связанная с паркетом, или мне нужна другая отладка?

1 Ответ

0 голосов
/ 16 января 2019

Parquet не предоставляет встроенную поддержку векторов Spark ML / MLlib, а также эти первоклассные граждане в Spark SQL.

Вместо этого Spark представляет Vectors, используя struct поля с тремя полями:

  • type - ByteType
  • size - IntegerType (необязательно, только для SparseVectors)
  • indices - ArrayType(IntegerType) (необязательно, только для SparseVectors)
  • values - ArrayType(DoubleType)

и использует метаданные, чтобы отличать их от простых structs и оболочек UDT для сопоставления с внешними типами. Преобразование между разреженным и плотным представлением не требуется. Тем не менее, в зависимости от данных, для такого представления может потребоваться сопоставимая память с полным плотным массивом.

Обратите внимание, что OOM при записи не обязательно связаны с самим процессом записи. Поскольку Spark, как правило, ленив, исключение может быть вызвано любой из вышестоящих стадий.

...