Cela ressemble à un problème idiot, mais je ne trouve pas un moyen de filtrer les valeurs NULL de mes lignes. Voici le résultat lorsque je vide l'objet geoinfo:
DUMP geoinfo;
([longitude # 70.95853, latitude # 30.9773])
([longitude # -9.37944507, latitude # 38.91780853])
(nul)
(nul)
(nul)
([longitude # -92.64416, latitude # 16.73326])
(nul)
(nul)
([longitude # -9.15199849, latitude # 38.71179122])
([longitude # -9.15210796, latitude # 38.71195131])
voici la description
DESCRIBE geoinfo;
geoinfo: {geoLocation: bytearray}
Ce que j'essaie de faire est de filtrer les valeurs nulles comme ceci:
geoinfo_no_nulls = FILTER geoinfo BY geoLocation n'est pas null;
mais le résultat reste le même. rien n'est filtré.
J'ai aussi essayé quelque chose comme ça
geoinfo_no_nulls = FILTER geoinfo BY geoLocation! = 'null';
et j'ai eu une erreur
org.Apache.pig.backend.executionengine.ExecException: ERREUR 1071: Impossible de convertir une carte en chaîne.
Qu'est-ce que je fais mal?
détails, en cours d'exécution sur Ubuntu, Hadoop-1.0.3 avec le porc 0.9.3
pig -version Apache Pig version 0.9.3-SNAPSHOT (reporté) compilé le 24 octobre 2012, 19:04:03
Version Java "1.6.0_24" Environnement d'exécution OpenJDK (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1) Serveur OpenJDK 64 bits VM (build 20.0-b12, mode mixte)
Merci pour vos réponses les gars. Cela m'aide à trouver le chemin.
En fin de compte, le problème semble être lié au JsonLoader que j'utilisais. Je ne sais pas pourquoi, mais il semble y avoir un bogue avec des chaînes vides.
J'ai finalement changé mon code pour utiliser https://github.com/kevinweil/elephant-bird .
le code ressemble maintenant à ceci:
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';
à votre santé
J'avais un problème similaire et quelque chose comme ça a fonctionné pour moi:
geoinfo_no_nulls = FILTER geoinfo BY geoLocation != '';
Essaye ça:
geoinfo_no_nulls = FILTER geoinfo BY (geomap#'geoLocation' is not null);
Comme je peux le constater, il s’agit de reconnaître le type comme une carte. Vous devez spécifier la clé particulière de la carte. Si cela ne fonctionne pas, vous n'obtenez normalement pas ces données correctement sous forme de carte. S'il vous plaît essayez comme Fred l'indique.
En supposant que vous souhaitiez que votre géolocalisation soit une carte avec la longitude et la latitude comme clés, vous pouvez CHARGER vos données en tant que carte et rechercher les valeurs NULL comme suit:
A = LOAD 'data' AS (f1:map[]);
B = FILTER A BY f1#longitude is not null and f1#latitude is not null;
C'est un peu une solution de contournement, cependant.