2016-11-15 20 views
0

私は〜4bnレコードを含むデータフレームを持っています。多くの列は64ビットの整数ですが、データを損失することなく32ビットまたは16ビットの整数に切り捨てることができます。64ビット整数をスパークデータフレームの32ビット(16ビット)intに変換する価値はありますか?

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と表示されます。

したがって、int型を切り捨てようとする価値はありますか?

私はスタンドアローンモードでSpark 2.01を使用しています。

答えて

1

数字をバイナリ(parquet、avro)で保存する形式で書き込む予定がある場合は、スペースを節約できます。計算にはおそらく速度に違いはありません。

+0

スパークはSSEとそれに類する指示を利用しませんか? –

+0

Sparkは、JVMが与えることができるものだけを使用します。 Javaの場合、数値型を変更することで実際の速度向上はありません:http://stackoverflow.com/questions/2380696/java-short-integer-long-performance – Mariusz

0

他の誰かの利益のために、これを横切ってつまずく。私が理解していると、JVMの実装(マシン/ OS固有)によって異なりますが、私の場合はほとんど違いがありません。私はRHEL 7 64bitでJava 1.8.0_102を実行しています。

大きなデータフレーム(3tn +レコード)で試しました。 57.1Gb

私は、このキャッシュされたデータフレームを作成するために使用されるタスク - ショートパンツのよう59.6Gb

  • - long型として

    • :データフレームは7ロング/ショートタイプのcoulmns、およびダブルスとして2が含まれています実行時間にも大きな違いは見られませんでした。

      です。記憶容量のサイズはレコード数に比例して拡大するようです。だからそれは良いです。

  • 関連する問題