Parquet 如何处理 SparseVector 列?

lU5*_*5er 2 apache-spark parquet pyspark

我对 PySpark 很陌生。我正在构建一个 tfidf 并希望将其作为中间结果存储在磁盘中。现在,IDF 评分为我提供了 SparseVector 表示。

然而,当尝试将其保存为 Parquet 时,我遇到了 OOM。我不确定它是否在内部将 SparseVector 转换为 Dense,因为在这种情况下,它将导致大约 25k 列,并且根据线程,以列格式保存如此大的数据可能会导致 OOM。

那么,您知道会发生什么情况吗?我的执行程序内存为 8g,并在 2g CSV 文件上运行。

我应该尝试增加内存还是将其保存为 CSV 而不是 Parquet?任何帮助表示赞赏。提前致谢。

更新1

正如所指出的,Spark 执行延迟评估,该错误可能是由于上游阶段造成的,我在写入之前尝试了显示和收集。他们似乎运行良好,没有抛出错误。那么,这仍然是与 Parquet 相关的问题还是我需要一些其他调试?

104*_*ica 6

Parquet 不提供对 Spark ML / MLlib Vector 的本机支持,这些也不是 Spark SQL 中的一等公民。

相反,Spark 表示Vectors使用struct具有三个字段的字段:

  • type-ByteType
  • size- IntegerType(可选,仅适用于SparseVectors
  • indices- ArrayType(IntegerType) (可选,仅适用于SparseVectors
  • values-ArrayType(DoubleType)

并使用元数据将它们与普通structs和 UDT 包装器区分开来映射回外部类型。不需要稀疏表示和稠密表示之间的转换。尽管如此,根据数据的不同,这种表示可能需要与完整密集数组相当的内存。

请注意,写入时 OOM 不一定与写入过程本身相关。由于 Spark 通常是惰性的,因此异常可能是由任何上游阶段引起的。