是否值得在 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 位)整数?的主要内容,如果未能解决你的问题,请参考以下文章
在 Pyspark 中将 Pandas 数据帧转换为 Spark 数据帧的 TypeError
在 zeppelin 中将 pandas 数据帧转换为 spark 数据帧