是否值得在 spark 数据帧中将 64 位整数转换为 32 位(16 位)整数?

Posted

技术标签:

【中文标题】是否值得在 spark 数据帧中将 64 位整数转换为 32 位(16 位)整数?【英文标题】:Is it worth converting 64bit integers to 32bit (of 16bit) ints in a spark dataframe? 【发布时间】:2016-11-15 17:30:16 【问题描述】:

我有一个包含约 40 亿条记录的数据框。许多列是 64 位整数,但可以截断为 32 位或 16 位整数而不会丢失数据。当我尝试使用以下函数转换数据类型时:

def switchType(df, colName):
    df = df.withColumn( colName + "SmallInt", df[colName].cast(ShortType()))
        df = df.drop(colName)
        return df.withColumnRenamed(colName + 'SmallInt', colName)

positionsDf = switchType(positionsDf, "FundId")
# repeat for 4 more cols...
print(positionsDf.cache().count())

这显示在 ram 中占用了 54.7 MB。当我不这样做时,它在 ram 中显示为 56.7MB。

那么,是否值得尝试截断整数?

我在独立模式下使用 Spark 2.01。

【问题讨论】:

【参考方案1】:

如果您打算以将数字保存为二进制(parquet、avro)的格式编写它,它可能会节省一些空间。对于计算,速度可能没有差异。

【讨论】:

Spark 不利用 SSE 和类似指令吗? Spark 只使用 JVM 可以提供的东西。在 Java 的情况下,通过更改数值类型并没有真正提高速度:***.com/questions/2380696/…【参考方案2】:

好的,为了其他偶然发现这一点的人的利益。如果我理解它,这取决于您的 JVM 实现(因此,特定于机器/操作系统),但在我的情况下,它几乎没有什么区别。我在 RHEL 7 64 位上运行 java 1.8.0_102。

我尝试使用更大的数据框(3tn+ 记录)。数据框包含 7 个短/长类型的列,以及 2 个双精度列:

只要 - 59.6Gb 作为短裤 - 57.1Gb

我用来创建这个缓存​​数据帧的任务在执行时间上也没有真正的差异。

值得一提的是,存储大小似乎与记录数呈线性关系。所以这很好。

【讨论】:

以上是关于是否值得在 spark 数据帧中将 64 位整数转换为 32 位(16 位)整数?的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何将64位整数转字符串

在 Pyspark 中将 Pandas 数据帧转换为 Spark 数据帧的 TypeError

在 zeppelin 中将 pandas 数据帧转换为 spark 数据帧

如何在火花中将数据帧转换为csv [重复]

spark中将每个组作为新数据帧并在循环中传递另一个函数的最佳方法是啥?

如何在 jupyter notebook 中将 spark 数据帧写入 avro 文件格式?