2016-11-15 73 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

我用任務來創建這個緩存​​的數據幀也沒有顯示出執行時間的實際差異。

什麼值得注意的是,存儲大小看起來似乎與記錄數成線性比例關係。這很好。

相關問題