1

RegexSerDe で NULL 値を処理するにはどうすればよいですか? 私はデータを含むファイルを持っています:

cat MOS/ex1.txt

123,dwdjwhdjwh,456

543,\N,956

私はテーブルを持っています:

CREATE TABLE mos.stations (usaf string, wban STRING, name string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
    "input.regex" = "(.*),(.*),(.*)"
);

ファイルからテーブルにデータを正常にロードしました。

LOAD DATA LOCAL INPATH '/home/hduser/MOS/ex1.txt' OVERWRITE INTO TABLE mos.stations;

単純な選択はうまくいきます:

hive> select * from mos.stations;

123dwdjwhdjwh456

543\N956

そして、次はエラーで終了します:

select * from mos.stations where wban is null;
[Hive Error]: Query returned non-zero code: 9, cause: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask

なにが問題ですか?

4

1 に答える 1

1

考えられる問題がいくつかあります。

1) null 処理とはまったく関係がない場合があります。最初のクエリは実際には M/R ジョブを生成しませんが、2 番目のクエリは生成するため、jar が tasktracker のクラスパスにないため、RegexSerde が M/R タスクによって認識されない単純なクラスパスの問題である可能性があります。システム上の hive-contrib jar が存在する場所を見つけて、次のような方法で hive に認識させる必要があります。

add jar /usr/lib/hive/lib/hive-contrib-0.7.1-cdh3u2.jar

パスと jar 名が異なる場合があることに注意してください。クエリの直前にハイブを介して上記を実行できます。

2) 別の問題は、RegexSerde がデフォルトの LazySimpleSerde と同じように "\N" を実際に処理しないことです。最初のクエリ (リテラル "\N" を返す場所) で取得している出力から判断すると、そうである可能性があります。クエリを実行するとどうなりますwhere wban='\\N'か? またはwhere wban='\N'(ダブルエスケープが必要かどうかは忘れました)。

最後に、RegexSerde に関する注意事項を 1 つ。それは本当に便利ですが、デフォルトのserdeと比較して、1月に糖蜜が上り坂になるのは遅いです. データセットが大きく、それに対して多くのクエリを実行する予定がある場合は、RegexSerde が不要になるように前処理することをお勧めします。そうしないと、クエリごとにペナルティを支払うことになります。上記の同じデータセットは、デフォルトの serde で問題ないように見えます。

于 2012-08-03T17:03:01.310 に答える