2012-11-14 6 views
12

フラットファイルからハイブテーブルにデータをロードする際に、NULL値を取得しています。
私のテーブルの構造は、このようなものです:フラットファイルからハイブテーブルにデータをロードする際にヌル値を取得する

hive> create table test_hive (id int,value string); 

と私のフラット・ファイルは、このようなものです:
:私はnull値を取得しています以下のコマンドを実行していたときに


INPUT.TXT
1 a 
2 b 
3 c 
4 d 
5 e 
6 F 
7 G 
8 j 

hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive; 
hive> select * from test_hive; 
OK<br> 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 

スクリーンショット:

hive> create table test_hive (id int,value string); 
OK 
Time taken: 4.97 seconds 
hive> show tables; 
OK 
test_hive 
Time taken: 0.124 seconds 
hive> LOAD DATA LOCAL INPATH '/home/hduser/input2.txt' OVERWRITE INTO TABLE test_hive; 
Copying data from file:/home/hduser/input2.txt 
Copying file: file:/home/hduser/input2.txt 
Loading data to table default.test_hive 
Deleted hdfs://hydhtc227141d:54310/app/hive/warehouse/test_hive 
OK 
Time taken: 0.572 seconds 
hive> select * from test_hive; 
OK 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
Time taken: 0.182 seconds 
+2

は、おそらくあなたはハイブテーブルにロードするときに、あなたの入力ファイルで区切られているかの行/列を指定する必要があります。あなたは次のようなものを試してみることができます: 'create table test_hive(id int、value string)' 'TEXTFILE LOCATION 'として保存された行形式のフィールドを削除しました/ user/hadoop/hive/input'; ' –

+0

あなたが直面している問題は、データは ''で区切られています。テーブルを作成している間は、フィールドの区切り文字については言及していませんでした。だから、ハイブテーブルを作成するときにフィールドの区切り文字について言及しなければ、デフォルトでハイブは^ Aを区切り文字とみなします。 問題を解決するには、以下の構文を記述したテーブルを再作成すると動作します。 CREATE TABLE test_hive(ID INT、値STRING) 行フォーマットフィールドは '';で終了しました。 –

答えて

16

ハイブのデフォルトのフィールドターミネータは^ Aです。別のフィールド区切り文字を使用していることを明示的にcreate table文に記述する必要があります。ロラーンド曲げは、コメントで使用することを指摘するものと同様に

CREATE TABLE test_hive(id INT, value STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '; 

あなたが管理テーブル(とない外部表)を作成しているので、あなたは場所を指定する必要はありません。

1

ハイブのデフォルトのレコードとフィールド区切り文字リスト:

  1. \ nは

  2. ^A

  3. ^B

  4. ^C

^V^Aを押すと、^ AがVimに挿入されます。

1

要素はスペースまたはタブで区切られていますか?これらの手順に従って、タブにしましょう。区切られたスペースは '\ t'の代わりに ''を使用してください。

hive> CREATE TABLE test_hive(id INT, value STRING) row format 
    delimited fields terminated by '\t' line formated by '\n' stored as filename; 

あなたは今、あなたは正確にあなたの期待出力 "ファイル名" を取得します

hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive; 

hive> select * from test_hive; 

を入力するように持っているよりも。

1

解決策は非常に簡単です。テーブルは正しい方法で作成されていません。

問題の簡単な解決方法やその他の問題は、データの読み込み方法を知ることです。

mytableName(ID int型、値文字列)[EXISTれない場合]

行フォーマットはTEXTFILEとして格納 '/ T' BY TERMINATED

FIELDS

区切りのCREATE TABLE。あなたのテーブルを作成する

  1. 最初の行 :

は、今のコードを説明レム。 [IF NOT EXIST]はオプションで、テーブルが存在していてもそれを上書きしないかどうかを示します。そのより多くの安全対策。

  • 2行目 構造化フィールドの区切り文字をテーブルレベルで指定します。

  • 第3の項目 任意の1文字を含めることができますが、デフォルトは '\ 001'です。 '/ t'はタブスペース用です:あなたの場合 '|'互いに隣り合って、|で区切られたデータのためのものです。 1つの文字スペースの場合は ''です。など...

  • フォースライン: データを格納するファイルの種類を指定します。このファイルは、TEXTFILE、SEQUENCEFILE、RCFILE、またはBINARY SEQUENCEFILEです。または、データの格納方法をJavaの入出力クラスとして指定できます。

  • ローカルロード:表myTableName INTO

    LOCD DATA LOCAL INPATH '/your/data/path.csv' [上書き]。

    単純なselect *文でデータをチェックしてみてください。

    希望します。

    6

    データがフィールドで区切られていて、テーブルを作成しているときにフィールドの区切り文字について言及していないという問題があります。だから、ハイブテーブルを作成するときにフィールドの区切り文字について言及しなければ、デフォルトでハイブは^ Aを区切り文字とみなします。

    問題を解決するには、以下の構文を記述したテーブルを作り直すと効果があります。

    CREATE TABLE test_hive(id INT, value STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';

    +0

    Apache HiveServer2クライアントの例では、 "Ctrl-A"で区切られたファイル(a.txt)を使用してデータを表にロードします。まず第一に彼らはこのファイルを含んでおらず、次に私は彼らがそれについてのより多くの情報を提供したいと思っています。 – kostia

    0

    その年/月/日に相当する日付値が返され、文字列の形式である場合、それは日付形式YYYY-MM-DD に従うべきである「YYYY-MM-DD」をデータセットの日付欄をチェックしてください。文字列の値がこの形式と一致しない場合は、NULLが返されます。

    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-date

    +0

    @ B.Desaiありがとう、ちょうどハイブに従っていたdoc.please添付リンクを見てください –