【问题标题】:PySpark casting IntegerTypes to ByteType for optimizationPySpark 将 IntegerTypes 转换为 ByteType 以进行优化
【发布时间】:2018-07-11 08:54:54
【问题描述】:

我正在通过 parquet 文件将大量数据读入数据帧。我注意到大量的列要么有 1,0,-1 作为值,因此可以从 Ints 转换为 Byte 类型以节省内存。

我为此编写了一个函数并返回一个新的数据帧,其中的值转换为字节,但是当在 UI 中查看数据帧的内存时,我发现它只是保存为原始数据帧的转换,而不是作为一个新的数据帧本身,因此占用相同数量的内存。

我对 Spark 比较陌生,可能不完全了解其内部结构,那么我将如何开始将这些列设置为 ByteType?

【问题讨论】:

  • 你能分享你的代码吗?
  • 您在转换后是否执行了一些操作(如countfirst 等)?

标签: python apache-spark pyspark spark-dataframe


【解决方案1】:

TL;DR它可能有用,但在实践中影响可能比您想象的要小得多。

如您所见:

UI 中数据帧的内存,我看到它只是作为原始数据帧的转换而不是新数据帧本身保存的,因此占用的内存量相同。

对于存储,Spark 使用内存中的列式存储,它应用了许多优化,包括压缩。如果数据具有低基数,则可以使用运行长度编码或字典编码轻松压缩列,并且强制转换不会有任何区别。

【讨论】:

    【解决方案2】:

    为了看看有没有影响,可以尝试两件事:

    1. 将数据写回文件系统。一次使用原始类型,另一次使用您的优化。比较磁盘大小。
    2. 尝试在数据帧上调用 collect 并在操作系统的系统监视器中查看驱动程序内存,确保引发垃圾收集以获得更清晰的指示。再一次 - 在没有优化的情况下这样做一次,在优化的情况下再做一次。

    user8371915 在一般情况下是正确的,但要考虑到优化可能会或可能不会根据行组大小和字典编码阈值等各种参数启动。

    这意味着即使您确实看到了影响,也很有可能通过调整 spark 获得相同的压缩。

    【讨论】:

      猜你喜欢
      • 2014-06-20
      • 1970-01-01
      • 2020-09-17
      • 2012-07-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      相关资源
      最近更新 更多