Ответ 1
У меня была аналогичная проблема, и что-то вроде этого сработало для меня:
geoinfo_no_nulls = FILTER geoinfo BY geoLocation != '';
Это выглядит глупой проблемой, но я не могу найти способ фильтровать нулевые значения из моих строк. Это результат, когда я сбрасываю объект 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, смешанный режим)
У меня была аналогичная проблема, и что-то вроде этого сработало для меня:
geoinfo_no_nulls = FILTER geoinfo BY geoLocation != '';
Спасибо за ваши ответы. Это помогает мне найти путь.
В конце концов проблема заключается в использовании 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';
веселит
Предполагая, что вы хотите, чтобы ваша геолокация представляла собой карту с долготой и широтой в качестве ключей, вы могли бы НАГРУЖИТЬ ваши данные как карту и проверить нулевые значения следующим образом:
A = LOAD 'data' AS (f1:map[]);
B = FILTER A BY f1#longitude is not null and f1#latitude is not null;
Это только обходное решение.
Попробуйте следующее:
geoinfo_no_nulls = FILTER geoinfo BY (geomap#'geoLocation' is not null);
Как я вижу из ошибки, он распознает тип как карту. Вам нужно указать конкретный ключ карты. Если это не сработает, вы, как правило, не получаете эти данные в качестве карты. Пожалуйста, попробуйте, как указывает Фред.