2016-11-15 69 views
0

我有一个数据帧包含〜40亿条记录。许多列是64位整数,但可以截断为32位或16位整数,而不会丢失数据。当我尝试使用下面的函数转换数据类型:是否值得将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()) 

这显示了以54.7 MB RAM中。当我不这样做时,它在RAM中显示为56.7MB。

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

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

回答

1

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

+0

不是Spark利用SSE和类似指令吗? –

+0

Spark仅使用JVM可以提供的内容。在Java的情况下,改变数字类型并不能真正提高速度:http://stackoverflow.com/questions/2380696/java-short-integer-long-performance – Mariusz

0

好的,为了其他任何人的利益,绊倒了这一点。如果我理解它,它取决于你的JVM实现(所以,特定于机器/操作系统),但在我的情况下,它没有什么区别。我在RHEL 7 64bit上运行java 1.8.0_102。

我试图用更大的数据框(3tn +记录)。数据帧包含类型短/长和2的7个coulmns双打:

  • 作为多头 - 59.6Gb
  • 作为短裤 - 57.1Gb

我用任务来创建这个缓存​​的数据帧也没有显示出执行时间的实际差异。

什么值得注意的是,存储大小看起来似乎与记录数成线性比例关系。这很好。