Hive NULL処理
3135 ワード
Hiveは,使用中にNULL,’(空文字列)の判断と認識が避けられない.Hiveのデフォルトでは、下位ストレージの空の値は、他の従来のデータベースとは異なります.
1、hiveデフォルトでNull値を格納するルール(1)異なるデータ型のNull値を格納するルールIntとStringタイプ、NULL下位デフォルトでN、問合せ時にNULLと表示する.Stringタイプのデータが「」であれば、格納は「」であり、またIntタイプのフィールドにデータを挿入する」場合、結果はNです.
(2)異なるデータ型のNull値のクエリInt型に対してis nullを用いてNull値を判断することができ,string型に対して条件is nullはNのデータを検出し,条件=",クエリは「」のデータである.
2、hive下位層の記憶と識別の空の値を修正する方式でテーブルを構築する時、NULL DEFINED ASで空の値の符号化方式を定義することができ、すでに作成したテーブルに対してalter table table_name SET SERDEPROPERTIES(‘serialization.null.format’=’N’)文はhive下位層が空の値を格納する方法を変更します.
hdfsに以下の5行のデータのファイルがあると仮定する:1|NULL|100 2|null|200 3|N|300 4||400 5|five|500
次の表作成文を使用して、ファイルへの外部表を作成します.
(1)デフォルトでhiveは下位データがNのデータこそ空の値であり,クエリ結果はNULLで表され,is null条件でクエリされたのは3番目のレコードである.
(2)hive下位層に空文字’’’で空の値を格納したい場合は、テーブルの構築時にNULL DEFINED ASでテーブルの属性値serializationを指定または変更することができる.null.format. テーブル作成時にNull値の符号化方法を指定します.
テーブルのプロパティを変更します.null.format空の値を変更する符号化方法:alter table null_test SET SERDEPROPERTIES(‘serialization.null.format’ = ”); このときis nullクエリ条件で検出された結果は4番目のデータです.
同様にhive下位層に格納された空の値の符号化方式を文字列「null」と変更することができ、is nullクエリ条件によって検出された結果は2番目のデータである.
3、sqoopを使用してhiveテーブルデータをoracleに導いたとき、空の値でエラーが発生しました.hive下位レベルの空の値がデフォルトのNである場合、oracleをインポートすると次のエラーが表示されます:Caused by:java.lang.RuntimeException:Can't parse input data:'N'では、(1)sqoopエクスポート文に追加–input-null-string"\N"–input-null-non-string"\N"パラメータを追加し、Nを空文字に変換する方法で解決できます.(2)表の作成時にNULL DEFINED ASによりhive下位層に空文字を使用して空の値を格納し識別することを宣言する.(3)alter table table_を通すname SET SERDEPROPERTIES(‘serialization.null.format’=")文はhive下位ストレージを変更し、空の値が空の文字であることを識別する’’’’’を変更しますが、変更後はデータを再実行する必要があります.
以上より、外部とデータのやり取りが必要なテーブルについては、NULL DEFINED ASを使用してhive下位層に空文字’’’’’を使用して空の値を格納し、識別することを推奨し、不要なエラーを低減します.クエリー文では、フィールドcが空の値であると判断する条件は、c is null or length(c)=0またはc is null or c=’’と書くことを推奨する.
1、hiveデフォルトでNull値を格納するルール(1)異なるデータ型のNull値を格納するルールIntとStringタイプ、NULL下位デフォルトでN、問合せ時にNULLと表示する.Stringタイプのデータが「」であれば、格納は「」であり、またIntタイプのフィールドにデータを挿入する」場合、結果はNです.
(2)異なるデータ型のNull値のクエリInt型に対してis nullを用いてNull値を判断することができ,string型に対して条件is nullはNのデータを検出し,条件=",クエリは「」のデータである.
2、hive下位層の記憶と識別の空の値を修正する方式でテーブルを構築する時、NULL DEFINED ASで空の値の符号化方式を定義することができ、すでに作成したテーブルに対してalter table table_name SET SERDEPROPERTIES(‘serialization.null.format’=’N’)文はhive下位層が空の値を格納する方法を変更します.
hdfsに以下の5行のデータのファイルがあると仮定する:1|NULL|100 2|null|200 3|N|300 4||400 5|five|500
次の表作成文を使用して、ファイルへの外部表を作成します.
CREATE EXTERNAL TABLE null_test(
c1 int,
c2 string,
c3 int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION '/dianshang/asiainfo/null_test';
(1)デフォルトでhiveは下位データがNのデータこそ空の値であり,クエリ結果はNULLで表され,is null条件でクエリされたのは3番目のレコードである.
(2)hive下位層に空文字’’’で空の値を格納したい場合は、テーブルの構築時にNULL DEFINED ASでテーブルの属性値serializationを指定または変更することができる.null.format. テーブル作成時にNull値の符号化方法を指定します.
CREATE EXTERNAL TABLE null_test(
c1 int,
c2 string,
c3 int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
NULL DEFINED AS ''
LOCATION '/dianshang/asiainfo/null_test';
テーブルのプロパティを変更します.null.format空の値を変更する符号化方法:alter table null_test SET SERDEPROPERTIES(‘serialization.null.format’ = ”); このときis nullクエリ条件で検出された結果は4番目のデータです.
同様にhive下位層に格納された空の値の符号化方式を文字列「null」と変更することができ、is nullクエリ条件によって検出された結果は2番目のデータである.
3、sqoopを使用してhiveテーブルデータをoracleに導いたとき、空の値でエラーが発生しました.hive下位レベルの空の値がデフォルトのNである場合、oracleをインポートすると次のエラーが表示されます:Caused by:java.lang.RuntimeException:Can't parse input data:'N'では、(1)sqoopエクスポート文に追加–input-null-string"\N"–input-null-non-string"\N"パラメータを追加し、Nを空文字に変換する方法で解決できます.(2)表の作成時にNULL DEFINED ASによりhive下位層に空文字を使用して空の値を格納し識別することを宣言する.(3)alter table table_を通すname SET SERDEPROPERTIES(‘serialization.null.format’=")文はhive下位ストレージを変更し、空の値が空の文字であることを識別する’’’’’を変更しますが、変更後はデータを再実行する必要があります.
以上より、外部とデータのやり取りが必要なテーブルについては、NULL DEFINED ASを使用してhive下位層に空文字’’’’’を使用して空の値を格納し、識別することを推奨し、不要なエラーを低減します.クエリー文では、フィールドcが空の値であると判断する条件は、c is null or length(c)=0またはc is null or c=’’と書くことを推奨する.