HDFS の専用ストレージ サーバーに大量のデータを保存する必要があります。これは、履歴データのある種のアーカイブです。格納されるデータは行指向であり、数十の異なる種類のフィールドがあります。それらのいくつかは文字列であり、いくつかは整数であり、いくつかの Float、Short、ArrayList、および Map もあります。
アイデアは、MapReduce または Spark ジョブを使用してデータが時々スキャンされるということです。
現在、キーとして NullWritable を、値としてカスタム WritableComparable クラスを使用して、それらを SequenceFiles として保存しています。このカスタム クラスには、これらすべてのフィールドが定義されています。
私は 2 つの目標を達成したいと考えています。1 つはデータのサイズを最適化することです。データは非常に大きくなり、数週間ごとに新しいサーバーを追加する必要があり、コストは常に増加しています。もう 1 つは、新しいフィールドを簡単に追加できるようにすることです。現在の状態では、新しいフィールドを追加したい場合は、古いデータをすべて書き直す必要があります。
このクラス内で EnumMap を使用してこれを達成しようとしました。新しいフィールドを簡単に追加でき、データのサイズが 20% 削減されたため、非常に良い結果が得られました (レコード内の多くのフィールドが空であることが多いためです)。しかし、私が書いたコードは見栄えが悪く、この EnumMap にリストとマップを追加しようとすると、さらに醜くなります。同じタイプのデータには問題ありませんが、すべてのフィールドを結合しようとするのは悪夢です。
そこで、他の一般的な形式をいくつか考えました。Avro と Parquet を試しましたが、データのサイズは Enums で試す前のカスタム クラスの SequenceFiles とほぼ同じです。したがって、古いデータを書き換える必要なく新しいフィールドを追加する問題は解決しますが、データのサイズを最適化する可能性はもっとあると感じています。
もう 1 つ確認することは、もちろん、データのロードにかかる時間です (これにより、bzip2 圧縮を使用しても問題ないか、パフォーマンスのために gzip に戻らなければならないかがわかります)。これを進めてください。誰かが他の解決策やヒントを提案してくれるのではないかと思っていました。
すべてのコメントに感謝します。