куст RegexSerDe null

Как мне работать со значениями NULL в RegexSerDe? У меня есть файл с данными:

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

Что не так?


person yabel    schedule 03.08.2012    source источник


Ответы (1)


Я вижу пару возможных проблем:

1) Это может вообще не иметь ничего общего с нулевой обработкой. Первый запрос на самом деле не порождает задание M/R, в то время как второй делает это, поэтому это может быть простая проблема пути к классам, когда RegexSerde не виден задачам M/R, потому что его jar не находится в пути к классам средства отслеживания задач. Вам нужно будет найти, где находится jar-файл hive-contrib в вашей системе, а затем сообщить об этом hive с помощью чего-то вроде:

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

Обратите внимание, что ваш путь и имя jar могут отличаться. Вы можете запустить вышеуказанное через куст прямо перед вашим запросом.

2) Другая проблема может заключаться в том, что RegexSerde на самом деле не работает с «\N» так же, как LazySimpleSerde по умолчанию. Судя по выводу, который вы получаете в первом запросе (где он возвращает литерал «\N»), это может иметь место. Что произойдет, если вы запросите where wban='\\N'? или where wban='\N' (я забыл, если вам нужен двойной выход).

Наконец, одно предостережение о RegexSerde. Хотя это действительно удобно, в январе оно медленно, как патока, идет в гору по сравнению с сердом по умолчанию. Если набор данных большой и вы планируете выполнять к нему много запросов, лучше всего выполнить предварительную обработку, чтобы вам не требовался RegexSerde. В противном случае вы будете платить штраф за каждый запрос. Тот же набор данных, что и выше, выглядит так, как будто он подходит для serde по умолчанию.

person Paul M    schedule 03.08.2012