2017-11-20 10 views
1

Spark 2.2では、文字列の空の文字列値をlit(null)に置き換えた後、永続化されたDataFrameサイズに大きな影響を与えることがわかりました。空の文字列をnullに置き換えると、データフレームサイズが増えますか?

これは私が空の文字列値を置き換えるために使用する機能です。

def nullifyEmptyStrings(df:DataFrame): DataFrame = { 
    var in = df 
    for (e <- df.columns) { 
     in = in.withColumn(e, when(length(col(e))===0, lit(null:String)).otherwise(col(e))) 
    } 
    in 
    } 

私は、この関数を実行する前に、私の最初のデータフレームの持続(DISK_ONLY)サイズは1480メガバイトで、その後1610メガバイトであることを確認します。パーティションの数は変更されません。

どのような考えですか? nullingはうまく動作しますが、これを導入する主な理由は、シャッフルサイズを小さくすることでした。この方法でしか増加しないようです。

+0

null値で外部ファイル(CSVなど)に保存してSparkに再ロードできますか?私はあなたがデータフレームを作成するときに列の内部エンコーディングを最適化するSparkから来ていると思います。 – Fabich

+0

はい、私は実験として試してみましょう - しかし、それは生産現場で私のためにはうまくいかないので、助けになるならこれを達成するためのプログラム的な方法があることを願っています – Chondrops

+0

フォローアップ私の終わり:CSVとしての永続化とSparkへの再読み込みは、DataFrameの永続化されたサイズにまったく影響しません。空の文字列よりもまだ大きいです。 Hiveテーブル(寄木張り)に書き込んでリロードしても同じことを試しましたが、それでも効果はありません。 – Chondrops

答えて

1

ここで私は共有するのに役立ついくつかの調査を行ったので、私はこれに自分自身で答えるつもりです。

完全にString列のDataFramesをテストすると、空の文字列をnullに置き換えるとS3(1.1-1.5%)の寄木張りにシリアル化されたときにディスク全体のフットプリントがわずかに減少することがわかります。

ただし、MEMORY_ONLYまたはDISK_ONLYのいずれかにキャッシュされたデータフレームは、それぞれ6%と8%大きくなっています。 ColumnがStringTypeのときにSparkがNULL値を内部的にどのように表しているかは推測できますが、それが何であれ、空の文字列よりも大きくなります。これを調べる方法があれば、それを聞いてうれしいでしょう。

この現象は、PySparkとScalaで同じです。

nullを使用する私たちの目標は、複雑な結合アクションでシャッフルサイズを減らすことでした。全体的に、我々は反対を経験した。ただし、isNotNullフィルタを自動的にプッシュダウンすると、Spark SQLで結合をよりきれいにすることができるため、引き続きnullを使用します。

-1

同じ結果がここにあります。また、多くの異なる値を持つ巨大なパーティションが、辞書とは対照的に列を列として格納する可能性があるため、パーティションの数を確認する必要があります。

+0

あなたは適切な回答をしていません。代わりに彼の質問にコメントすることができます。 –

+0

だから私は70のレコードを保持している102のパーティションを持っているので、パーティション当たり約700Kの行です。 Sparkがより効率的なストレージ戦略を開始するために、パーティション番号を増やすことを提案しているようです。私は正しく理解していますか? – Chondrops

関連する問題