デフォルトでは、Hive はファイルをプレーン テキスト ファイルとして保存し、レコードをプレーン テキストとして保存するだけで、すべて圧縮されていません。一部の入力ではコンマよりも便利なフィールドセパレータにASCII 0x1を使用しますが、Hiveをコンマ区切りの値で動作させる方法を理解したと確信しています。Hive で別のファイル形式を使用する場合は、別の方法でシリアル化/逆シリアル化するか、データを圧縮して、いくつかの異なるオプションを試してみてください。
追加設定なしで、Hive はいくつかの異なるファイル形式 ( TEXTFILE
、SEQUENCEFILE
、およびRCFILE
. これらの違いは、ファイルの読み取り、分割、書き込みの方法に関係しています。TEXTFILE
がデフォルトで、通常のテキスト ファイルで動作します。SEQUENCEFILE
Hadoop エコシステムの他の部分で簡単に使用できるバイナリ キーと値のペア形式です。AndRCFILE
は、Hive テーブルを保存するための列指向の方法です。このファイル形式に加えて、独自のファイル形式を作成したり、さまざまなニーズを満たすために他の人が作成したファイル形式を見つけたりすることができます。
データを保存するファイル形式に加えて、SerDe を指定することで、テーブル内のレコードをシリアル化および逆シリアル化する方法を決定できます。Hive 0.9.1 以降には がパックされておりAvroSerDe
、Avro はデータをバイナリ形式で保存します (スキーマ自体も複雑になるため)。「ハイブ バイナリ SerDe」を Google で検索するLazyBinarySerde
と、バイナリ形式で保存するより簡単な方法のように聞こえる が明らかになりました。また、ニーズに合うものが見つからない場合は、いつでも独自の SerDe を作成できます。
あなたの質問は、Hive テーブルを小さくしたり、パフォーマンスを向上させたりする方法の大きな文脈に当てはまると思います。この目的のために、上で述べたすべてのものの上に圧縮を適用できます。これを行うには、次のコマンドを使用して、出力を圧縮するように Hive に指示し、圧縮するコーデックを指示します。
hive> set hive.exec.compress.output=true;
hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
これらの設定をセッションの外で維持したい場合は、設定ファイルでこれを変更できます (クラスターを共有している場合は、他の人の Hive および MapReduce ジョブを含む)。私が SnappyCodec を使用しているのは、箱から出してすぐに Hive で動作し、分割可能であり、費やされた CPU 時間に対して適切な圧縮/解凍を提供するためです。別のコーデックがニーズにより適していると判断する場合があります。
すべてのデータが CSV 形式の場合、これらすべてのオプションをどのように適用しますか? 最も簡単な方法は、CSV ファイルの上にテーブルを作成し、必要なファイル形式と SerDe を使用して別のテーブルを作成し、CSV に基づくテーブルから新しいテーブルにデータを挿入することです (Hive 出力を圧縮していることを確認してください)。選択したコーデックで)。内部では、Hive が 1 つの形式 (CSV) からのデータの読み取りと別の形式への書き込み (ユーザーが決定したものは何でも) を処理します。この後、データの複製が作成され、必要に応じて CSV ファイルを削除できます。
CREATE EXTERNAL TABLE csv_table (id INT, name STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
LOCATION /user/muehlbau/yourData;
CREATE TABLE binary_table (id INT, name STRING)
ROW FORMAT SERDE org.apache.hadoop.hive.serde2.lazybinary.LazyBinarySerDe
STORED AS SEQUENCEFILE;
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
INSERT OVERWRITE TABLE binary_table
SELECT * FROM csv_table
上記の例は、利用可能なすべてのオプションを利用する方法を示していますが、それをデフォルトの合理的な使用例とは考えないでください。さまざまなファイル形式/SerDes/圧縮コーデックを読み、パフォーマンス テストを行ってアプローチを決定します。