再び不足しているハイブのドキュメント:
クエリの結果と列の名前をローカルファイルに書き込みたいのですが。
Hiveはこれをサポートしていますか?
Insert overwrite local directory 'tmp/blah.blah' select * from table_name;
また、別の質問:StackOverflowはHiveヘルプを取得するのに最適な場所ですか?@Nija、とても役に立ちましたが、私は彼らを悩ませ続けることはしません...
試す
set hive.cli.print.header=true;
はい、できます。メインディレクトリまたは他のハイブユーザープロパティファイルのファイルに 入れset hive.cli.print.header=true;
ます。.hiverc
あいまいな警告: これは過去に私のクエリをクラッシュさせたので注意してください (理由は思い出せません)。
確かに、@nijaの答えは正しいです-少なくとも私が知る限り。insert overwrite into [local] directory ...
(ローカルを使用するかどうかに関係なく)実行時に列名を書き込む方法はありません。
@user1735861 によって説明されたクラッシュに関して、Hive には既知のバグ0.7.1
( で修正済み0.8.0
) があり、実行後、出力を生成しない HQL コマンド/クエリのset hive.cli.print.header=true;
原因となります。NullPointerException
例えば:
$ ハイブ -S ハイブ > デフォルトを使用します。 ハイブ > セット hive.cli.print.header = true; ハイブ > デフォルトを使用します。 スレッド「メイン」での例外 java.lang.NullPointerException org.apache.hadoop.hive.cli.CliDriver.processCmd (CliDriver.java:222) で org.apache.hadoop.hive.cli.CliDriver.processLine (CliDriver.java:287) で org.apache.hadoop.hive.cli.CliDriver.main (CliDriver.java:517) で sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) で java.lang.reflect.Method.invoke(Method.java:616) で org.apache.hadoop.util.RunJar.main(RunJar.java:197) で
これは問題ありませんが:
$ ハイブ -S ハイブ > セット hive.cli.print.header = true; ハイブ > デュアルから * を選択します。 c c ハイブ>
ただし、非 HQL コマンドは問題ありません ( set
、dfs
!
など...)
Hive は、ローカル ディレクトリへの書き込みをサポートしています。構文も適切に見えます。
詳細については、SELECTS と FILTERS のドキュメントを参照してください。
実行中のクエリの列の名前をファイルに書き込む方法が Hive にあるとは思いません。. . 確実にないとは言えませんが、方法がわかりません。
今日、この問題に遭遇し、元のクエリとヘッダー行を作成する新しいダミー クエリとの間で UNION ALL を実行することで、必要なものを取得できました。各セクションにソート列を追加し、ヘッダーを 0 に、データを 1 に設定して、そのフィールドでソートし、ヘッダー行が一番上に来るようにしました。
create table new_table as
select
field1,
field2,
field3
from
(
select
0 as sort_col, --header row gets lowest number
'field1_name' as field1,
'field2_name' as field2,
'field3_name' as field3
from
some_small_table --table needs at least 1 row
limit 1 --only need 1 header row
union all
select
1 as sort_col, --original query goes here
field1,
field2,
field3
from
main_table
) a
order by
sort_col --make sure header row is first
少しかさばりますが、少なくとも 1 つのクエリで必要なものを取得できます。
お役に立てれば!
素晴らしい解決策ではありませんが、これが私が行うことです:
create table test_dat
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t" STORED AS
INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
LOCATION '/tmp/test_dat' as select * from YOUR_TABLE;
hive -e 'set hive.cli.print.header=true;select * from YOUR_TABLE limit 0' > /tmp/test_dat/header.txt
cat header.txt 000* > all.dat
これが私の見解です。注意してください、私はbashに精通していないので、改善の提案を歓迎します:)
#!/usr/bin/env bash
# works like this:
# ./get_data.sh database.table > data.csv
INPUT=$1
TABLE=${INPUT##*.}
DB=${INPUT%.*}
HEADER=`hive -e "
set hive.cli.print.header=true;
use $DB;
INSERT OVERWRITE LOCAL DIRECTORY '$TABLE'
row format delimited
fields terminated by ','
SELECT * FROM $TABLE;"`
HEADER_WITHOUT_TABLE_NAME=${HEADER//$TABLE./}
echo ${HEADER_WITHOUT_TABLE_NAME//[[:space:]]/,}
cat $TABLE/*