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
これにより、使用できるタブ区切りファイルが作成されます。それがあなたにも役立つことを願っています。
this patch-3682 に基づいて、Hive 0.11を使用するとより良いソリューションが利用できると思いますが、これを自分でテストすることはできません。新しい構文により、次のことが可能になります。
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
select books from table;
お役に立てば幸いです。
CSVファイルが必要な場合は、次のようにLukasのソリューションを変更できます(Linuxボックスを使用している場合):
Hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
CREATE TABLE AS SELECT(CTAS)ステートメントを使用して、クエリの結果を含むファイルでHDFSにディレクトリを作成する必要があります。その後、これらのファイルをHDFSから通常のディスクにエクスポートし、単一のファイルにマージする必要があります。
また、ファイルを '\ 001'からCSVに変換するためにいくつかのトリックを実行する必要がある場合があります。カスタムCSV SerDeを使用するか、抽出したファイルを後処理できます。
HUEを使用している場合、これも非常に簡単です。 HUEのHiveエディターに移動し、Hiveクエリを実行して、結果ファイルをXLSまたはCSVとしてローカルに保存するか、結果ファイルをHDFSに保存します。
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
私は同様のソリューションを探していましたが、ここで言及したものは機能しません。私のデータには、すべてのバリエーションの空白(スペース、改行、タブ)文字とコンマがありました。
列データ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が作成されました。これがこのソリューションを探している人たちの助けになることを願っています。
私は同様の問題を抱えていましたが、これは私がそれを解決する方法でした。
ステップ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"
次の例のように、INSERT
…DIRECTORY
…を使用できます。
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';
OVERWRITE
およびLOCAL
の解釈は以前と同じであり、パスは通常の規則に従って解釈されます。呼び出されるリデューサーの数に応じて、1つ以上のファイルが/tmp/ca_employees
に書き込まれます。
デフォルトのセパレータは「^A
」です。 python言語では、「\x01
」です。
区切り文字を変更するときは、次のようなSQLを使用します。
SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table
次に、delimiter + "^A
"を新しい区切り文字と見なします。
私はこれに遅れているかもしれませんが、答えを手伝います:
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
さまざまなオプションを試しましたが、これはPython
Pandas
の最も簡単な解決策の1つです。
Hive -e 'select books from table' | grep "|" ' > temp.csv
df=pd.read_csv("temp.csv",sep='|')
tr "|" ","
を使用して「|」を変換することもできます「」へ
このシェルコマンドは、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に変更し、クエリを実行します
Windowsから実行する場合は、Python script hivehoney を使用して、テーブルデータをローカルCSVファイルに抽出できます。
そうなる:
次のように実行します。
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
クエリを開始した後、次のステップをさらにカバーするために: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
上記のRayの回答と同様に、Hortonworks Data PlatformのHive View 2.0では、Hiveクエリを実行し、出力をcsvとして保存することもできます。
これは、HiveQLの結果を出力するために見つけた最もCSVフレンドリーな方法です。
データをフォーマットするのにgrepやsedコマンドは必要ありません。代わりに、Hiveはそれをサポートし、outputformatの追加タグを追加するだけです。
Hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv