Vous êtes sur la page 1sur 3

École Nationale Supérieure d’Informatique et d’Analyse des Systèmes

Pr T. RACHAD. - Année universitaire 2020/2021


Atelier 4 du Big Data
Introduction à Hive
1. Objectif
l’objectif de cet atelier est de savoir comment analyser des données massives sans recourir au
Framework MapReduce. L’atelier est basé sur l’outil Hive et le cas d’utilisation retenu est l’analyse de
sentiments dans les tweets.
2. Matériel de l’atelier
Vérifier que vous avez chargé les fichiers ci-dessous dans le système de fichier HDFS
• Les tweets sous format json sont dans le répertoire :
/user/cloudera/ateliers/atelier2/tweets/input/data.txt.
• Les mots négatifs : /user/cloudera /ateliers/atelier2/tweets/input/negative-words.txt
• Les mots positifs : /user/cloudera /ateliers/atelier2/tweets/input/positive-words.txt
• Les mots neutres : /user/cloudera /ateliers/atelier2/tweets/input/stop-words.txt
3. Détection de sentiments dans les tweets
3.1. Chargement des tweets dans la base de données
Nous commençons par charger les différents tweets bruts disponibles dans le fichiers
« /user/cloudera/ateliers/atelier2/tweets/input/data.txt. » dans une table que nous appelons
« tweets_brutes ».
Le fichier data.txt comporte des tweets au format json selon le format suivant :
{
"created_at": "Thu Apr 06 15:24:15 +0000 2017",
"id_str": "850006245121695744",
"text": "1\/ Today we\u2019re sharing our vision for the future of the Twitter API
platform!\nhttps:\/\/t.co\/XweGngmxlP",
"user": {
"id": 2244994945,
"name": "Twitter Dev",
"screen_name": "TwitterDev",
"location": "Internet",
"url": "https:\/\/dev.twitter.com\/",
"description": "Your official source for Twitter Platform news, updates & events. Need
technical help? Visit https:\/\/twittercommunity.com\/ \u2328\ufe0f #TapIntoTwitter"
},
"place": {
},
"entities": {
"hashtags": [
],
"urls": [
{
"url": "https:\/\/t.co\/XweGngmxlP",
"unwound": {
"url": "https:\/\/cards.twitter.com\/cards\/18ce53wgo4h\/3xo1c",
"title": "Building the Future of the Twitter API Platform"
}
}
],
"user_mentions": [
]
}
}
Pour que hive reconnaît le format ci-dessous, on utilisera la librairie json_serde dans sa version 8. La table
tweets_raw sera crée comme suit :

add jar /home/cloudera/json-serde-1.3.8-jar-with-dependencies.jar;


create table tweets_raw( id string , user_name string , created_at string ,
text string ) row format serde 'org.openx.data.jsonserde.JsonSerDe' ;

load data inpath 'user/cloudera/ateliers/atelier2/tweets/input/data.txt' overwrite


into table tweets_raw

Maintenant, on doit extraire les mots de chaque tweets dans une autre table que nous appelons
tweets_splitted:

create table tweets_splitted as


select id , word from tweets_raw lateral view explode( split ( text , ' ' ))
tweets_splitted as word where word rlike '^[a-zA-Z]+$' ;

Extrait de la table tweets_splitted :


id = ‘123445’ tweet= ‘le big data est une technologie qui permet de traiter les donnees massives’

id word
123445 le
123445 big
123445 est
123445 une
123445 technologie
123445 qui

Maintenant nous avons comme résultat la table tweets_splitted qui comporte les différents mots de chaque
tweet du fichier data.txt.
3.2. Création du dictionnaire des termes
Pour détecter le sentiment dominant dans chaque tweet, nous nous basons sur les termes contenus dans le
fichiers negative-words.txt, positive-words.txt et stop-words.txt. pour ce faire, on crée une table dict qui
associe les différents mots des trois fichiers à leur rank (positif → 1, neutre → 0, 
négatif → -1).

create table dict(words string , rank int );


Comme les mots contenus dans les fichiers de mots positifs, négatifs et neutres sont séparés par des retour
à la ligne on doit: créer une table tampon avec comme délimiteur de ligne ‘\n’

create table words_tmp(word string ) row format delimited


lines terminated by '\n' ;
On charge les mots positifs dans la table tampon (ça à pour effet de mettre chaque mot sur une ligne)
avant de les insérer dans la table dict avec le rank correspondant (=1).

2
load data inpath '/user/cloudera/ateliers/atelier2/tweets/input/positive-words.txt'
overwrite into table words_tmp;
insert into table dict select * , 1 as rank from words_tmp;

Extraite de la table dict

word rank

Good 1

Best 1

less -1

in 0

to 0

On fait de même avec les mots négatifs et neutres

load data inpath '/user/cloudera/ateliers/atelier2/tweets/input/negative-words.txt'


overwrite into table words_tmp;
insert into table dict select * , -1 as rank from words_tmp;

load data inpath '/user/cloudera /ateliers/atelier2/tweets/input/stop-words.txt'


overwrite into table words_tmp;
insert into table dict select * , 0 as rank from words_tmp;
Finalement, on Crée une table tweets_score qui joint les mots de tweets_splitted à leur rang contenu dans
la table dict et on somme ces rangs groupés par id. Puis on affiche le résultat.

create table tweet_score as


select id , sum ( rank ) as score from tweets_splitted join dict on tweets_splitted
.word= dict .word
group by id ;
select * from tweet_score;

id rank
878775 -90
787567 100
….

Vous aimerez peut-être aussi