Parquet如何处理SparseVector列?

时间:2019-01-16 19:35:45

标签: apache-spark pyspark parquet

我是PySpark的新手。我正在构建一个tfidf,并希望将其存储在磁盘中作为中间结果。现在,IDF评分为我提供了SparseVector表示形式。

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

那么,有什么想法呢?我的执行者内存为8g,并在2g CSV文件上运行。

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

更新1

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

1 个答案:

答案 0 :(得分:1)

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

相反,Spark使用Vectors字段和三个字段来表示struct

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

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

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