フラットファイルから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
Hiveのデフォルトのフィールドターミネーターは^ Aです。別のフィールドセパレーターを使用していることをcreate tableステートメントで明示的に言及する必要があります。
Lorand Bendingがコメントで指摘したのと同様に、以下を使用します。
CREATE TABLE test_Hive(id INT, value STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';
(外部テーブルではなく)管理テーブルを作成するため、場所を指定する必要はありません。
直面している問題は、データ内のフィールドが「」で区切られていることと、テーブルの作成中にフィールド区切り文字について言及しなかったためです。そのため、Hiveテーブルの作成中にフィールド区切り文字について言及しない場合、デフォルトでは、Hiveは^ Aを区切り文字と見なします。
したがって、問題を解決するために、以下の構文を記載したテーブルを再作成すると、機能します。
CREATE TABLE test_Hive(id INT, value STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';
Hiveのデフォルトのレコードおよびフィールド区切り文字リスト:
\ n
^ A
^ B
^ C
^ V ^ Aを押すとVimに^ Aを挿入できます。
解決策は非常に簡単です。テーブルは正しい方法で作成されません。
問題またはその他の問題に対する簡単な解決策は、データのロード方法を知ることです。
CREATE TABLE [存在しない場合] mytableName(id int、value string)
行フォーマットの区切り
'/ t'で終了するフィールド
TEXTFILEとして保存。
次に、lemmeがコードを説明します。
最初の行テーブルを作成します。 [IF NOT EXIST]はオプションであり、テーブルが存在するかどうかを上書きしないことを通知します。安全対策の詳細。
2行目構造化フィールドのテーブルレベルで区切り文字を指定します。
3番目のアイテム任意の1文字を含めることができますが、デフォルトは「\ 001」です。 '/ t'はタブスペース用です:あなたの場合 '|' |で区切られ、|で区切られたデータ用です「」は1つの文字スペースです。等々...
Forth Line:データが保存されるファイルのタイプを指定します。ファイルには、TEXTFILE、SEQUENCEFILE、RCFILE、またはBINARY SEQUENCEFILEを使用できます。または、データの保存方法をJava入力および出力クラスとして指定できます。
ローカルにロードする場合:
LOCD DATA LOCAL INPATH '/your/data/path.csv' [OVERWRITE] INTO TABLE myTableName;
常に単純なselect *ステートメントでデータをチェックしてみてください。
それが役に立てば幸い。
データセットの日付列を確認してください。日付形式yyyy-mm-ddに従っている必要があります。文字列が「yyyy-mm-dd」の形式の場合、その年/月/日に対応する日付値が返されます。文字列値がこの形式と一致しない場合、NULLが返されます。 Hive公式ドキュメント
要素はスペースまたはタブで区切られていますか?次の手順に従ってください。スペースを区切る場合は、「\ 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;
これで、期待どおりの出力「ファイル名」が正確に得られます。