デフォルトでは、Hiveはファイルをプレーンテキストファイルとして保存し、レコードをプレーンテキストとして保存します。すべて非圧縮です。いくつかの入力に対してカンマよりも便利なフィールド区切り文字としてASCII 0x1を使用していますが、Hiveにカンマ区切りの値を使用させる方法を工夫したことは確かです。 Hiveに別のファイル形式を使用させたり、異なる方法でシリアライズ/デシリアライズしたり、データを圧縮したりするには、いくつかのオプションがあります。
出荷時の設定では、TEXTFILE
,SEQUENCEFILE
、RCFILE
という複数のファイル形式がサポートされています。ファイルの読込み、分割、書込みの方法との違いがあります。 TEXTFILE
がデフォルトであり、通常のテキストファイルで動作します。 SEQUENCEFILE
は、Hadoopエコシステムの他の部分で簡単に使用されるバイナリのKey-Valueペア形式です。 RCFILE
は、Hiveテーブルを保存するための列指向の方法です。このファイル形式に加えて、独自のものを作成したり、さまざまなニーズに合わせて他の人が書いたものを見つけることができます。
データが保存されているファイル形式に加えて、SerDeを指定することで、テーブル内のレコードのシリアル化とデシリアライズを決めることができます。 Hive 0.9.1以降にはAvroSerDe
が含まれており、Avroはバイナリ形式でデータを保存します(スキーマ自体にはいくつかの問題があります)。 「ハイブバイナリSerDe」のGoogle検索では、LazyBinarySerde
と表示され、バイナリ形式で保存する方が簡単です。あなたが必要とするものを見つけることができない場合は、いつでも自分のSerDeを書くことができます。
あなたの疑問は、ハイブテーブルを小さくしたりよりパフォーマンスを高める方法の大きなコンテキストに当てはまると思います。この目的のために、上記で言及したすべてのものの上に圧縮を適用することができます。これを達成するためには、単にそれが出力だ圧縮し、次のコマンドを使用して圧縮するコーデックそれを伝えるためにハイブを伝える:
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/compressionコーデックを読んで、あなたのアプローチを解決するいくつかのパフォーマンステストを行います。
詳細な説明をありがとうございます! – muehlbau
すばらしい答え! +1 – davek