2016-05-19 2 views
3

ハイブテーブルでnull以外の値に対してselect文を実行すると、応答に正しい結果がありません。結果は、 "nullではない"のような表現です!式 "IS NOT NULL"がHQLで動作しない

select count(*) 
from test_table 
where test_col_id1='12345' and test_col_id2 is not null; 

test_col_id1test_col_id2は、パーティション・キーではありません。

私のハイブバージョンです。

ハイブ0.14.0.2.2.0.0-2041

がここにテーブルです:

... | test_col_id1 | test_col_id2 |
... | 12345 | x |
... | 12345 | NULL |

このクエリは2レコードを返します。

+1

どのような種類のSerDeを使用していますか?Text、Sequence、AVRO、Parquet、ORC?あなたが* Nullだと思う値を持つ行を選択すると、それは "null"または空の文字列として表示されますか? –

+0

Hiveのどのバージョン? TEZ *(どちらのバージョン)*またはプレーンなMapReduceを使用していますか? –

+0

私はコマンドラインから質問しています。レコードを照会すると、コマンドラインに** NULL **が表示されます。 –

答えて

4

次のクエリを試してください。行が返されますか?

select count(*) 
from test_table 
where test_col_id1='12345' and test_col_id2 != 'NULL'; 

次に、あなたのNULLそれは、文字列 'NULL' だ、NULLではありません。人々の負荷はNULL文字列のハイブ治療に問題があります。デフォルトでは、空白の文字列''です。他にも必要な場合は、テーブルを作成するときにNULL文字列を扱う方法を厳密に指定する必要があります。 NULLとして認識されるものを変更する方法の3つの例を以下に示します。 NULLとして最初の1組の「NULL」の文字列:あなたはすでにあなたのテーブルを作成しましたので、それが認識されるように

CREATE TABLE nulltest1 (id STRING, another_string STRING) 
TBLPROPERTIES('serialization.null.format'='NULL') --sets the string 'NULL' as NULL; 
CREATE TABLE nulltest2 (id STRING, another_string STRING) 
TBLPROPERTIES('serialization.null.format'='') --sets empty string as NULL; 
CREATE TABLE nulltest3 (id STRING, another_string STRING) 
TBLPROPERTIES('serialization.null.format'='\N'); --sets \N as NULL; 

は、あなたがあなたのテーブルを変更することができ、あなたの'NULL'NULLとして:

ALTER TABLE test_table SET TBLPROPERTIES ('serialization.null.format' = 'NULL'); 
0

ハイブ別の方法でNULL値を解析します。

ハイブは空の値がNULLであるとはみなしません。ただし、既定では、Hiveはを使用して NULL(特殊文字ではなく、バックスラッシュと大文字のNのみ)を表します。あなただけのすべての空の値をフィルタリングしたい場合は 、あなたはハイブテーブルにロードされたオリジナルのテキストファイル内の実際のNULL値を使用する場合は、あなたが試すことができ

where test_col_id2 != ''

を使用することができます

where test_col_id2 != '\000'

octonaryのNULLのASCIIコードは00で、最初の "0"は8進数を意味するためです。ところで

、あなたはまた、コマンドを使用することができます。

alter table $YOUR_TABLE SETSERDEPROPERTIES('serialization.null.format' ='abc') 

あなたはハイブは、いくつかのテーブルのNULL値として「ABC」を解析したい場合は、「ABC」にNULL値をカスタマイズします。