2013-05-06 12 views
11

実際にCSVデータをバイナリHive形式にロードする方法があるかどうかは疑問に思っています。つまり、リレーショナルデータベースでデータを読み込むのと同じことは、解析と入力の変換とバイナリ形式での格納です。 Hiveの場合は別のバイナリファイル)。 Hiveの参考文献によれば、load data inpathコマンドは「任意の変換」をしないので、タイプが文字列から整数などに変換されていないと思われます。私はOCRとRCFileフォーマットについて読んでいましたが、CSVからの文字列値がマシンの整数値に変換されてHDFSに格納されているかどうかを調べることができませんでした。それは事実ですか? HiveにCSVファイルのバイナリ表現を作成するための他の可能性はありますか?CSVデータを「バイナリ」ハイブ形式に読み込む方法はありますか?

関連するメモ:私はHiveがクエリ処理中に文字列値を機械表現に変換し、文字列値を比較していないと思われます - この仮定は正しいですか?

答えて

21

デフォルトでは、Hiveはファイルをプレーンテキストファイルとして保存し、レコードをプレーンテキストとして保存します。すべて非圧縮です。いくつかの入力に対してカンマよりも便利なフィールド区切り文字としてASCII 0x1を使用していますが、Hiveにカンマ区切りの値を使用させる方法を工夫したことは確かです。 Hiveに別のファイル形式を使用させたり、異なる方法でシリアライズ/デシリアライズしたり、データを圧縮したりするには、いくつかのオプションがあります。

出荷時の設定では、TEXTFILE,SEQUENCEFILERCFILEという複数のファイル形式がサポートされています。ファイルの読込み、分割、書込みの方法との違いがあります。 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コーデックを読んで、あなたのアプローチを解決するいくつかのパフォーマンステストを行います。

+0

詳細な説明をありがとうございます! – muehlbau

+0

すばらしい答え! +1 – davek

関連する問題