4

Hive で Hadoop ストリーミング ジョブを作成しています。ストリーミング スクリプトで、受信しているテーブルの列名を認識できるようにしたいと考えています。設定を試みましset hive.cli.print.header=true;たが、これにより、スクリプトで使用できるようにせずに名前がコンソールに出力されます(私が知る限り)。

理想的には、データ型も利用できるようにすることもできます。

Hadoop ストリーミング API または Hive に、ストリーミング ジョブで列名を取得できるオプションはありますか?

更新: Hadoop 環境変数を抽出し、Hive スクリプトから任意の変数を設定して、ストリーミング スクリプトで使用できるようにしました。これらの環境変数へのアクセスにより、データ列名にアクセスできるか、ハックな方法でそれらを渡すことができるかどうかを調査しています。

4

1 に答える 1

3

回答を送信していますが、これは「初期」データに列名が含まれている場合にのみ機能します。データには、ある種のキーと値のペア構造が必要です。キーに基づいてハイブとクエリにマップ構造を使用して入力タイプを格納できるようになりました。例を挙げます。

次のようなデータを含む場所「/user/input」に hdfs にファイルがあるとします。

A B C1=D1:C2=D2:C3=D3:C7=D4
E F C1=H1:C7=H2:C5=H4

hive で次を実行します。

hive>> create external table my_external_table 
       (column1 string, column2 string, my_map map<string,string>) 
       row format delimited 
       fields terminated by ' ' 
       collection items terminated by ':' 
       map keys terminated by '=' 
       lines terminated by '\n' 
       stored as textfile location '/user/input';
hive>> select * from my_external_table;
result>> A B {"C1":"D1","C2":"D2","C3":"D3","C7":"D4"}
         E F {"C1":"H1","C7":"H2","C5":"H4"}

クエリをそのまま実行できるようになりました

hive >> select map_keys[my_map] from my_external_table;
result >> ["C1","C2","C3","C7"]
hive >> select map_values[my_map] from my_external_table;
result >> ["D1","D2","D3","D4"]
          ["H1","H2","H3","H4"]
hive >> select "C1",my_map['C1'] from my_external_table;
result >> C1    D1
          C1    H1
hive >> select map("C1",my_map['C1']) from my_external_table;
result >> {"C1":"D1"}
          {"C1":"H1"}

そして、いくつかの既存のマップ キー値を使用して新しいテーブルを作成する場合は、次の手順を実行します。

hive >> create table my_new_table as select map('C1',my_map['C1'],'C2',my_map['C2']) from my_external_table;
hive >> select * from my_new_table;
result >> {"C1":"D1","C2":"D2"}
          {"C1":"H1","C2":null}

したがって、上記の方法を使用して、キー名と値名を格納する新しいテーブルを作成し、それらに対して任意の種類の変換を実行できます。ただし、初期データがキーと値のペアとして格納されている場合に限ります。

:

  1. 必要に応じて列名をハイブ クエリに追加するスクリプトを簡単に作成できます。
  2. 「初期」データに列名が含まれていないと仮定すると、データを変換して列名を含めることができます。または、カスタムマッパーを使用して、データをキーと値のペアとしてエコーアウトすることもできます
  3. 私は独自の区切り記号を保持しています。必要に応じて自由に変更してください。
  4. column1 と column2 も持つ必要はありません。すべてのデータがキーと値のペアである必要はないことを示すために残しました
于 2012-12-04T12:38:55.107 に答える