HIVEピット——NULLと空の文字列処理

9870 ワード

ここではHIVEで遭遇したNULLと空文字列の問題について簡単に検討し、踏み込みを避ける!!!

たんじゅんたんさく


まず新しいテストテーブルtest_を作成します01は、後続のテストとして使用されます.
CREATE  TABLE IF NOT EXISTS `test_01`(
  `id` INT, `name` STRING,`age` INT, `score` FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;

簡単ないくつかのテストデータを追加します.具体的には以下の通りです.
  insert overwrite  table test_01
  select NULL,NULL,10,95
  union all select 2 ,'',10,95
  union all select 3 ,'Lucy',15,NULL
  union all select 4,'Jack',15,100;

新規データの表示
hive (tmp)> select * from test_01;
OK
NULL	NULL	10	95.0
2				10	95.0
3	    Lucy	15	NULL
4	    Jack	15	100.0

最下位HDFSファイルのデフォルトストレージフォーマット
[root@nd2 wh]# hadoop fs -cat /user/hive/warehouse/tmp.db/test_01/000000_0
\N,\N,10,95.0
2,,10,95.0
3,Lucy,15,\N
4,Jack,15,100.0

結論:デフォルトでは、STRINGタイプのデータが「最下位HDFSファイルのデフォルトストレージは」である場合.INTやSTRINGなどのデータがNULLの場合、下位HDFSはデフォルトでNに格納されます.
ここではname条件に基づいてクエリーを行います
--  name is null
hive (tmp)> select * from test_01 where name is null;
NULL	NULL	10	95.0
-- name = ''
hive (tmp)> select * from test_01 where name = '';
2		10	95.0
-- id is null
hive (tmp)> select * from test_01 where id is null;
NULL	NULL	10	95.0

デフォルトでは、INTに対してis nullを使用して空を判断できる.STRINGタイプの場合、条件is nullで調べられたのはNのデータです.条件=「,クエリされたのは」のデータです.

実際の状況.


HIVEの使用では、データストレージやその他のデータ移行、バックアップとして最下位のHDFSファイルを使用する必要がある場合が多い.このとき、下位HDFSファイルではNと「」の処理が重要になります(アプリケーションによっては下位ファイルの処理が異なる場合があります).HIVEでは、通常、テーブルを新規作成した後に実行します.
-- NULL。 '' 。 null '' , HDFS null 。
ALTER TABLE test_01 SET SERDEPROPERTIES ('serialization.null.format'='');

データを再挿入し、結果をクエリーします.
hive (tmp)> select * from test_01;
OK
NULL	NULL	10	95.0
2	    NULL	10	95.0
3		Lucy	15	NULL
4		Jack	15	100.0

最下位のHDFSファイルに格納されるデータフォーマットは
[root@nd2 wh]# hadoop fs -cat /user/hive/warehouse/tmp.db/test_01/000000_0
,,10,95.0
2,,10,95.0
3,Lucy,15,
4,Jack,15,100.0

最下位のデータは「」で保存されており,クエリで表示された結果がNULLであることが分かった.注:is nullまたは=「=」は、クエリーで表示された結果に基づいてフィルタされます.下位ファイル形式ではありません.クエリーの空の値はis nullで、=」を使用すると、データがクエリーされません.
--  name is null
hive (tmp)> select * from test_01 where name is null;
NULL	NULL	10	95.0
2	NULL	10	95.0
--  name =''
hive (tmp)> select * from test_01 where name ='';
OK
Time taken: 4.058 seconds