我有一个包含约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。
答案 0 :(得分:1)
如果您打算以二进制(镶木地板,avro)中的数字格式编写它,可能会节省一些空间。对于计算,速度可能没有差异。
答案 1 :(得分:0)
好的,为了其他任何偶然发现的人的利益。如果我理解它,它取决于你的JVM实现(因此,特定于机器/操作系统),但在我的情况下它没有什么区别。我在RHEL 7 64bit上运行java 1.8.0_102。
我尝试使用更大的数据帧(3tn +记录)。数据帧包含7个类型为short / long的coulmns,以及2个作为double的类型:
我用于创建此缓存数据框的任务也显示执行时间没有实际差异。
值得注意的是,存储大小似乎与记录数呈线性关系。这很好。