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

时间:2016-11-15 17:30:17

标签: apache-spark pyspark

我有一个包含约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。当我不这样做时,它显示为56.7MB的内存。

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

我尝试使用更大的数据帧(3tn +记录)。数据帧包含7个类型为short / long的coulmns,以及2个作为double的类型:

  • 渴望 - 59.6Gb
  • 作为短裤 - 57.1Gb

我用于创建此缓存数据框的任务也显示执行时间没有实际差异。

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