5

私はこのように構造化されたHIVEテーブルを持っています:-

Create table test_stg(employee_id INT, name STRING, abu ARRAY <String>, sabu MAP <String, ARRAY<INT>)
row format delimited fields terminated by '|'                                                              
collection items terminated by '/'                                                                         
map keys terminated by ':'; 

を使用して、ローカル ファイル システムからデータをインポートします。LOAD DATA LOCAL....

問題は、Map データ型フィールドsabuがネストされた配列を持つことができるように、ローカル ファイルの内容をどのように組み立てるべきかということです。

前もって感謝します。

4

2 に答える 2

17

Hive のデフォルトの区切り文字は次のとおりです。

  • 行区切り文字 => Control-A ('\001')
  • コレクション アイテム デリミタ => Control-B ('\002')
  • マップ キー区切り文字 => Control-C ('\003')

これらの区切り記号をオーバーライドすると、オーバーライドされた区切り記号が解析中に使用されます。デリミタの前述の説明は、複雑な型にプリミティブ型のみが含まれるフラットなデータ構造の通常の場合に当てはまります。ネストされた型の場合、ネストのレベルによって delimiter が決まります。

たとえば、配列の配列の場合、外側の配列の区切り文字は予想どおり Control-B ('\002') 文字ですが、内側の配列の場合は Control-C ('\003') 文字であり、次のリストの区切り記号。

Hive は実際には、ASCII コード 1、2、... 8 に対応する 8 つのレベルの区切り記号をサポートしていますが、オーバーライドできるのは最初の 3 つだけです。

ネストされた Map データ型フィールドsabuの項目の区切り文字の場合、Map Key Delimiter は「\003」であるため、「\004」になります ( 「:」として上書きされます)。

したがって、入力ファイルを次の形式で記述できます。

1|JOHN|abu1/abu2|key1:1'\004'2'\004'3/key2:6'\004'7'\004'8

の出力は次のSELECT * FROM test_stg; ようになります。

1       JOHN     ["abu1","abu2"]     {"key1":[1,2,3],"key2":[6,7,8]}

参照: Hadoop The Definitive Guide - Chapter 12: Hive、ページ番号: 433、434

于 2013-09-16T13:14:59.803 に答える
0

3つのステップでこれを行う簡単な方法を見つけました。「Hadoop The Definitive Guide - Chapter 12: Hive」からも参照

hive> create table test_stg2 as select 1, 'name', array('str1','str2'), map('key',array(1,2)) from dummy;

$ hdfs dfs -copyToLocal /user/hive/warehouse/test_stg2/000000_0 test_stg2_dump

$ vi test_stg2_dump

1^Aname^Astr1^Bstr2^Akey^C1^D2

それが必要です。また、ネスト レベルによって区切り文字が決まります

于 2014-11-04T06:19:22.707 に答える