2017-06-23 8 views
1

私はSparkのデータフレームに格納し、円柱ファイルとしてディスクに保存したい数百万行のテーブルを持っています。Spark Dataframe/Parquetの列挙型

私のパーケットファイルのサイズは現在2TBを超えており、これを最適化していることを確認したいと思います。

これらの列の大部分は長い文字列値ですが、値が非常に小さいこともよくあります。たとえば、2つの別個の値(20文字と30文字の文字列)を持つカラムがあり、平均文字数が400文字の文字列を持つ別のカラムがありますが、すべてのエントリに約400の異なる値しかありません。

リレーショナルデータベースでは、通常、これらの値を参照で別のテーブルに正規化するか、少なくとも何らかの種類の列挙型でテーブルを定義します。

DFファイルまたはパーケットファイルでそのパターンに一致するものは見つかりません。柱状ストレージはこれを効率的に処理していますか?または、これをさらに最適化するために何かを検討する必要がありますか?

+0

を有効にすることができます。これを読んでいる間に再びオブジェクト形式に変換することができます。それは効率的な方法ではない?バイト配列は文字列より少ないスペースを占めます。 –

答えて

2

寄木細工には列挙型の自動生成メカニズムはありませんが、ページ辞書を使用できます。ページ・ディクショナリは、データを書き換えるのではなく、行をディクショナリに単に参照できるように、寄せ木馬ページごとの値のリストを格納します。あなたが有効になってこれらのオプションを使用してファイルを記述する必要があり、またはそれは使用されないこと

spark.conf.set("parquet.dictionary.enabled", "true") 
spark.conf.set("parquet.dictionary.page.size", 2 * 1024 * 1024) 

注:スパークで寄木細工のライター用の辞書を有効にするには。

辞書を使用して存在するためにフィルタリングを有効にするには、私は `バイトが[]`寄木細工の列として格納するために、これらのオブジェクトを変換するために、あなたをお勧めしたい

spark.conf.set("parquet.filter.dictionary.enabled", "true") 

Source: Parquet performance tuning: The missing guide