28

再び不足しているハイブのドキュメント:

クエリの結果と列の名前をローカルファイルに書き込みたいのですが。

Hiveはこれをサポートしていますか?

Insert overwrite local directory 'tmp/blah.blah' select * from table_name;

また、別の質問:StackOverflowはHiveヘルプを取得するのに最適な場所ですか?@Nija、とても役に立ちましたが、私は彼らを悩ませ続けることはしません...

4

7 に答える 7

64

試す

set hive.cli.print.header=true;
于 2011-11-26T20:28:33.150 に答える
15

はい、できます。メインディレクトリまたは他のハイブユーザープロパティファイルのファイルに 入れset hive.cli.print.header=true;ます。.hiverc

あいまいな警告: これは過去に私のクエリをクラッシュさせたので注意してください (理由は思い出せません)。

于 2012-10-10T18:38:10.043 に答える
9

確かに、@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 コマンドは問題ありません ( setdfs !など...)

詳細はこちら: https://issues.apache.org/jira/browse/HIVE-2334

于 2012-10-26T15:04:34.127 に答える
7

Hive は、ローカル ディレクトリへの書き込みをサポートしています。構文も適切に見えます。
詳細については、SELECTS と FILTERS のドキュメントを参照してください。

実行中のクエリの列の名前をファイルに書き込む方法が Hive にあるとは思いません。. . 確実にないとは言えませんが、方法がわかりません。

SO よりも Hive に関する質問に適した唯一の場所はメーリング リストだと思います。

于 2011-04-14T02:28:15.630 に答える
4

今日、この問題に遭遇し、元のクエリとヘッダー行を作成する新しいダミー クエリとの間で 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 つのクエリで必要なものを取得できます。

お役に立てれば!

于 2014-08-09T01:40:30.170 に答える
3

素晴らしい解決策ではありませんが、これが私が行うことです:

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
于 2013-03-20T17:19:36.883 に答える
2

これが私の見解です。注意してください、私は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/*
于 2018-03-13T15:17:04.190 に答える