2017-08-09 3 views
1

J'ai chargé un dynamodb plein d'informations de twitter (format de json) dans la ruche. Le format du fichier JSON ressemble à ceci:Hive: Est-il possible d'utiliser regexp_extract sur un champ struct? (NullPointerException)

{"id":{"s":"894643473017561088"},"sentiment":{"s":"neutral"},"subjectivity":{"s":"0.0"},"username":{"s":"Jessi"},"geo":{"s":"None"},"location":{"s":"Valley of the sun☀️"},"polarity":{"s":"0.0"},"tweet":{"s":"b\"RT @bannerite: Donald Trump's lies have consequences. We're seeing them now | Charlotte Observer #DemForce""},"created_at":{"s":"Mon Aug 07 19:36:40 +0000 2017"},"screen_name":{"s":"JessiAtkins06"},"followers_count":{"s":"19"}} 

J'ai créé la table ruche comme ceci:

create external table table1 (
    > id struct<s:string>, 
    > sentiment struct<s:string>, 
    > subjectivity struct<s:string>, 
    > username struct<s:string>, 
    > geo struct<s:string>, 
    > location struct<s:string>, 
    > polarity struct<s:string>, 
    > tweet struct<s:string>, 
    > created_at struct<s:string>, 
    > screen_name struct<s:string>, 
    > followers_count struct<s:string>) 
    > ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' 
    > STORED AS TEXTFILE; 

Et puis chargé les données du fichier JSON en utilisant l'habituel « INPATH de données de charge .. ." formule.

J'ai besoin d'extraire hashtags du « tweet » le terrain, mais lorsque je tente de faire une expression régulière pour rechercher des hashtags, je reçois une erreur:

hive> select regexp_extract(lower(tweet), '/\B#\w*[a-zA-Z]+\w*/',0) as patterns 
    > from table1 
    > limit 10; 
FAILED: NullPointerException null 

Je me demande si cela est parce que du format struct des champs. J'aurais pu exporter le fichier dynamo en tant que csv, mais les tweets contiennent beaucoup de virgules. La même erreur se produit si le champ int est défini sur 0, 1 ou 2.

J'essaie de déterminer quelle valeur dans le champ est nulle et je ne suis pas sûr - j'ai essayé une commande similaire sur un table qui était composée de champs de type chaîne et cela a fonctionné. J'ai regardé le "Qu'est-ce qu'une NullPointerException, et comment puis-je le réparer?" fil mais n'a toujours aucune idée; Toute aide serait appréciée.

+0

Pouvez-vous envoyer la trace de la pile qui a conduit à l'exception NullPointerException? Il est généralement dans un dossier Hivelogs séparé –

+0

Je ne suis pas sûr si c'est une trace de pile, mais j'ai téléchargé hive.log à http://www.vaughn-s.net/hadoop/hive.log –

+0

Je ne vois pas NullPointerException n'importe où dans ce journal ... –

Répondre

1

J'ai retracé vos étapes et j'ai également reçu l'exception NullPointerException.

Ensuite, j'ai couru une simple requête et a ceci:

select tweet from table1; 
OK 
Failed with exception java.io.IOException:org.apache.hadoop.hive.serde2.SerDeException: org.codehaus.jackson.JsonParseException: Unexpected character ('"' (code 34)): was expecting comma to separate OBJECT entries 

Il semble que vos données d'entrée par exemple, vous avez un " supplémentaire (après #DemForce) qui brise la désérialisation JSON.

Vous pouvez ajouter \ avant chaque " dans le tweet afin que le " soit traité comme du texte.

Si vous exportez en tant que csv, vous devez préalablement supprimer toutes les virgules du contenu.

+0

Merci pour votre aide, c'est apprécié. Y a-t-il une meilleure façon de traiter les guillemets? Si j'importe à la place la dynamodb en tant que csv, y a-t-il un moyen de gérer toutes les virgules dans les tweets? –

+0

@lengthy_preamble J'ai mis à jour la réponse –

+0

Super, ça aide beaucoup! Merci encore –