web-dev-qa-db-ja.com

HiveQLクエリの結果をCSVに出力するにはどうすればよいですか?

hiveクエリの結果をCSVファイルに入れたいと思います。コマンドは次のようになるはずだと思いました。

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

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

ありがとう!

75
AAA

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

これにより、使用できるタブ区切りファイルが作成されます。それがあなたにも役立つことを願っています。

this patch-3682 に基づいて、Hive 0.11を使用するとより良いソリューションが利用できると思いますが、これを自分でテストすることはできません。新しい構文により、次のことが可能になります。

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

お役に立てば幸いです。

141
Lukas Vermeer

CSVファイルが必要な場合は、次のようにLukasのソリューションを変更できます(Linuxボックスを使用している場合):

Hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
21

CREATE TABLE AS SELECT(CTAS)ステートメントを使用して、クエリの結果を含むファイルでHDFSにディレクトリを作成する必要があります。その後、これらのファイルをHDFSから通常のディスクにエクスポートし、単一のファイルにマージする必要があります。

また、ファイルを '\ 001'からCSVに変換するためにいくつかのトリックを実行する必要がある場合があります。カスタムCSV SerDeを使用するか、抽出したファイルを後処理できます。

4
Olaf

HUEを使用している場合、これも非常に簡単です。 HUEのHiveエディターに移動し、Hiveクエリを実行して、結果ファイルをXLSまたはCSVとしてローカルに保存するか、結果ファイルをHDFSに保存します。

3
Ray

Hive文字列関数CONCAT_WS( string delimiter, string str1, string str2...strn )を使用できます

例:

Hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv
3
Ram Ghadiyaram

私は同様のソリューションを探していましたが、ここで言及したものは機能しません。私のデータには、すべてのバリエーションの空白(スペース、改行、タブ)文字とコンマがありました。

列データtsvを安全にするために、列データのすべての\ t文字をスペースに置き換え、コマンドラインでpythonコードを実行して、以下に示すようにcsvファイルを生成しました。

Hive -e 'tab_replaced_hql_query' |  python -c 'exec("import sys;import csv;reader = csv.reader(sys.stdin, dialect=csv.Excel_tab);writer = csv.writer(sys.stdout, dialect=csv.Excel)\nfor row in reader: writer.writerow(row)")'

これにより、完全に有効なcsvが作成されました。これがこのソリューションを探している人たちの助けになることを願っています。

3
sisanared

私は同様の問題を抱えていましたが、これは私がそれを解決する方法でした。

ステップ1-次のように、Hiveテーブルから別のテーブルにデータをロードしました

DROP TABLE IF EXISTS TestHiveTableCSV;
CREATE TABLE TestHiveTableCSV 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n' AS
SELECT Column List FROM TestHiveTable;

手順2-BlobをHiveウェアハウスから適切な拡張子で新しい場所にコピーしました

Start-AzureStorageBlobCopy
-DestContext $destContext 
-SrcContainer "Source Container"
-SrcBlob "Hive/warehouse/TestHiveTableCSV/000000_0"
-DestContainer "Destination Container"
-DestBlob "CSV/TestHiveTable.csv"
2

次の例のように、INSERTDIRECTORY…を使用できます。

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';

OVERWRITEおよびLOCALの解釈は以前と同じであり、パスは通常の規則に従って解釈されます。呼び出されるリデューサーの数に応じて、1つ以上のファイルが/tmp/ca_employeesに書き込まれます。

2
bigmakers

デフォルトのセパレータは「^A」です。 python言語では、「\x01」です。

区切り文字を変更するときは、次のようなSQLを使用します。

SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table

次に、delimiter + "^A"を新しい区切り文字と見なします。

1
moshaholo

私はこれに遅れているかもしれませんが、答えを手伝います:

echo "COL_NAME1 | COL_NAME2 | COL_NAME3 | COL_NAME4"> SAMPLE_Data.csv Hive -e '必要に応じてtable_Name where句から個別のconcat(COL_1、 "|"、COL_2、 "|"、COL_3、 "|"、COL_4)を選択します;' >> SAMPLE_Data.csv

0
Anil Kumar K B

さまざまなオプションを試しましたが、これはPythonPandasの最も簡単な解決策の1つです。

Hive -e 'select books from table' | grep "|" ' > temp.csv

df=pd.read_csv("temp.csv",sep='|')

tr "|" ","を使用して「|」を変換することもできます「」へ

0
notilas

このシェルコマンドは、csvの出力形式を、列ヘッダーなしでoutput.txtに出力します。

$ Hive --outputformat=csv2 -f 'hivedatascript.hql' --hiveconf Hive.cli.print.header=false > output.txt
Hive  --outputformat=csv2 -e "select * from yourtable" > my_file.csv

または

Hive  --outputformat=csv2 -e "select * from yourtable" > [your_path]/file_name.csv

Tsvの場合、上記のクエリでcsvをtsvに変更し、クエリを実行します

0
Terminator17

Windowsから実行する場合は、Python script hivehoney を使用して、テーブルデータをローカルCSVファイルに抽出できます。

そうなる:

  1. 要塞ホストにログインします。
  2. pbrun。
  3. kinit。
  4. ビーライン(クエリを使用)。
  5. エコーをビーラインからWindowsのファイルに保存します。

次のように実行します。

set PROXY_Host=your_bastion_Host

set SERVICE_USER=you_func_user

set LINUX_USER=your_SOID

set LINUX_PWD=your_pwd

python hh.py --query_file=query.sql
0
Alex B

クエリを開始した後、次のステップをさらにカバーするために:INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table;

私の場合、tempフォルダーの下に生成されたデータはdeflate形式で、次のようになります。

$ ls
000000_0.deflate  
000001_0.deflate  
000002_0.deflate  
000003_0.deflate  
000004_0.deflate  
000005_0.deflate  
000006_0.deflate  
000007_0.deflate

Deflateファイルを解凍し、すべてを1つのcsvファイルに入れるコマンドは次のとおりです。

hadoop fs -text "file:///home/lvermeer/temp/*" > /home/lvermeer/result.csv
0
JohnnyHuo

上記のRayの回答と同様に、Hortonworks Data PlatformのHive View 2.0では、Hiveクエリを実行し、出力をcsvとして保存することもできます。

0
schoon

これは、HiveQLの結果を出力するために見つけた最もCSVフレンドリーな方法です。
データをフォーマットするのにgrepやsedコマンドは必要ありません。代わりに、Hiveはそれをサポートし、outputformatの追加タグを追加するだけです。

Hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv
0