Подтвердить что ты не робот

Фильтрация нулевых значений с помощью свиньи

Это выглядит глупой проблемой, но я не могу найти способ фильтровать нулевые значения из моих строк. Это результат, когда я сбрасываю объект geoinfo:

Геоинформация DUMP;
([долгота # 70,95853, широта # 30,9773])
([долгота # -9,37944507 широта # +38,91780853])
(нуль)
(нуль)
(нуль)
([долгота # -92,64416, широта # 16,73326])
(нуль)
(нуль)
([долгота # -9,15199849 широта # +38,71179122])
([долгота # -9,15210796 широта # +38,71195131])

вот описание

ОПИСАНИЕ geoinfo;
геоинфо: {geoLocation: bytearray}

То, что я пытаюсь сделать, это отфильтровать нулевые значения следующим образом:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation не является нулевым;

но результат остается тем же. ничего не фильтруется.

Я тоже пробовал что-то вроде этого

geoinfo_no_nulls = FILTER geoinfo BY geoLocation!= 'null';

и я получил сообщение об ошибке

org.apache.pig.backend.executionengine.ExecException: ERROR 1071: невозможно преобразовать карту в строку

Что я делаю неправильно?

подробности, работающие на ubuntu, hadoop-1.0.3 со свиньей 0.9.3

свинья -версия Версия Apache Pig 0.9.3-SNAPSHOT (rexported) составлено 24 октября 2012, 19:04:03

java version "1.6.0_24" Окружающая среда OpenJDK (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1) OpenJDK 64-Bit Server VM (сборка 20.0-b12, смешанный режим)

4b9b3361

Ответ 1

У меня была аналогичная проблема, и что-то вроде этого сработало для меня:

geoinfo_no_nulls = FILTER geoinfo BY geoLocation != '';

Ответ 2

Спасибо за ваши ответы. Это помогает мне найти путь.

В конце концов проблема заключается в использовании JsonLoader, который я использовал. Я не знаю, почему именно, но это швы, чтобы иметь ошибку с нулевыми строками.

Наконец-то я изменил свой код, чтобы использовать https://github.com/kevinweil/elephant-bird.

код теперь выглядит следующим образом:

    register 'elephant-bird-core-3.0.0.jar'
    register 'elephant-bird-pig-3.0.0.jar'
    register 'google-collections-1.0.jar'
    register 'json-simple-1.1.jar'

    json_lines = LOAD '/twitterecho/tweets/stream/v1/json/2012_10_10/08' USING com.twitter.elephantbird.pig.load.JsonLoader();

    geo_tweets = FOREACH json_lines GENERATE (CHARARRAY) $0#'id' AS id, (CHARARRAY) $0#'geoLocation' AS geoLocation;

    tweets_grp = GROUP geo_tweets BY id;
    unique_tweets = FOREACH tweets_grp {
          first_tweet = LIMIT inpt 1;
          GENERATE FLATTEN(first_tweet);
    };

    only_not_nulls = FILTER geo_tweets BY geoLocation is not null;
    store only_not_nulls into '/twitter_data/results/geo_tweets';

веселит

Ответ 3

Предполагая, что вы хотите, чтобы ваша геолокация представляла собой карту с долготой и широтой в качестве ключей, вы могли бы НАГРУЖИТЬ ваши данные как карту и проверить нулевые значения следующим образом:

A = LOAD 'data' AS (f1:map[]);
B = FILTER A BY f1#longitude is not null and f1#latitude is not null;

Это только обходное решение.

Ответ 4

Попробуйте следующее:

geoinfo_no_nulls = FILTER geoinfo BY (geomap#'geoLocation' is not null);

Как я вижу из ошибки, он распознает тип как карту. Вам нужно указать конкретный ключ карты. Если это не сработает, вы, как правило, не получаете эти данные в качестве карты. Пожалуйста, попробуйте, как указывает Фред.