web-dev-qa-db-ja.com

フラットファイルからHiveテーブルにデータを読み込むときにnull値を取得する

フラットファイルからHiveテーブルにデータをロードしているときにnull値を取得しています。
私のテーブル構造は次のとおりです:

Hive> create table test_Hive (id int,value string);

そして、私のフラットファイルはこのようなものです:input.txt

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

以下のコマンドを実行すると、null値が表示されます。

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
15
user1823697

Hiveのデフォルトのフィールドターミネーターは^ Aです。別のフィールドセパレーターを使用していることをcreate tableステートメントで明示的に言及する必要があります。

Lorand Bendingがコメントで指摘したのと同様に、以下を使用します。

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

(外部テーブルではなく)管理テーブルを作成するため、場所を指定する必要はありません。

19
Mark Grover

直面している問題は、データ内のフィールドが「」で区切られていることと、テーブルの作成中にフィールド区切り文字について言及しなかったためです。そのため、Hiveテーブルの作成中にフィールド区切り文字について言及しない場合、デフォルトでは、Hiveは^ Aを区切り文字と見なします。

したがって、問題を解決するために、以下の構文を記載したテーブルを再作成すると、機能します。

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

6
Mufaddal Kamdar

Hiveのデフォルトのレコードおよびフィールド区切り文字リスト:

  1. \ n

  2. ^ A

  3. ^ B

  4. ^ C

^ V ^ Aを押すとVimに^ Aを挿入できます。

1
songhir

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

問題またはその他の問題に対する簡単な解決策は、データのロード方法を知ることです。

CREATE TABLE [存在しない場合] mytableName(id int、value string)

行フォーマットの区切り

'/ t'で終了するフィールド

TEXTFILEとして保存。

次に、lemmeがコードを説明します。

  1. 最初の行テーブルを作成します。 [IF NOT EXIST]はオプションであり、テーブルが存在するかどうかを上書きしないことを通知します。安全対策の詳細。

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

  3. 3番目のアイテム任意の1文字を含めることができますが、デフォルトは「\ 001」です。 '/ t'はタブスペース用です:あなたの場合 '|' |で区切られ、|で区切られたデータ用です「」は1つの文字スペースです。等々...

  4. Forth Line:データが保存されるファイルのタイプを指定します。ファイルには、TEXTFILE、SEQUENCEFILE、RCFILE、またはBINARY SEQUENCEFILEを使用できます。または、データの保存方法をJava入力および出力クラスとして指定できます。

ローカルにロードする場合:

LOCD DATA LOCAL INPATH '/your/data/path.csv' [OVERWRITE] INTO TABLE myTableName;

常に単純なselect *ステートメントでデータをチェックしてみてください。

それが役に立てば幸い。

1
user 451

データセットの日付列を確認してください。日付形式yyyy-mm-ddに従っている必要があります。文字列が「yyyy-mm-dd」の形式の場合、その年/月/日に対応する日付値が返されます。文字列値がこの形式と一致しない場合、NULLが返されます。 Hive公式ドキュメント

1

要素はスペースまたはタブで区切られていますか?次の手順に従ってください。スペースを区切る場合は、「\ t」の代わりに「」を使用します。OK。

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
Venu A Positive