1. ホーム
  2. database

[解決済み] HiveQLクエリの結果をCSVに出力するにはどうしたらいいですか?

2023-06-15 10:01:49

質問

Hiveのクエリの結果をCSVファイルに書き出したいと思っています。コマンドはこんな感じでいいのかなと。

insert overwrite directory '/home/output.csv' select books from table;

実行すると、正常に完了したと表示されるのですが、ファイルが見当たりません。どうすればこのファイルを見つけることができるのでしょうか、それとも別の方法でデータを抽出する必要があるのでしょうか。

どのように解決するのですか?

を使用することは可能ですが INSERT OVERWRITE を使用してHiveからデータを取り出すことは可能ですが、特定のケースには最適な方法ではないかもしれません。まず最初に INSERT OVERWRITE が何をするのかを説明し、次に私がHiveのテーブルからtsvファイルを取得するために使用している方法を説明します。

によると マニュアルによると によると、あなたのクエリはHDFSのディレクトリにデータを保存します。フォーマットはcsvではありません。

ファイルシステムに書き込まれたデータは、列が^Aで区切られ、行が改行で区切られたテキストとしてシリアライズされます。列のいずれかがプリミティブ型でない場合、それらの列はJSON形式にシリアライズされます。

わずかな修正 (たとえば LOCAL キーワードを追加)すると、ローカルディレクトリにデータが保存されます。

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;

同じようなクエリを実行すると、以下のような出力になります。

[lvermeer@hadoop temp]$ ll
total 4
-rwxr-xr-x 1 lvermeer users 811 Aug  9 09:21 000000_0
[lvermeer@hadoop temp]$ head 000000_0 
"row1""col1"1234"col3"1234FALSE
"row2""col1"5678"col3"5678TRUE

個人的には、このような場合はコマンドラインでHiveから直接クエリを実行し、それをこのようにローカルファイルにパイプするのが普通です。

hive -e 'select books from table' > /home/lvermeer/temp.tsv

これで、タブ区切りのファイルができあがりました。これがあなたにとっても有用であることを願っています。

に基づいて このパッチ-3682 は、Hive 0.11を使用する場合、より良いソリューションが利用可能であると思われますが、私自身はこれをテストすることができません。新しい構文は、以下を可能にするはずです。

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
select books from table;

お役に立てれば幸いです。