Blog

Sentiment-Analyse mit Apache Hive

Joris Bontje

Aktualisiert Oktober 22, 2025
4 Minuten

Apache Hive ist ein Data Warehouse-System, das auf Hadoop aufbaut. Mit einer SQL-ähnlichen Sprache können Sie Daten abfragen, die im Hadoop-Dateisystem (HDFS) gespeichert sind. Diese Abfragen werden dann in Map-Reduce-Aufträge übersetzt und auf Ihrem Cluster ausgeführt. Als Beispiel analysieren wir Tweets aus den Twitter Streaming Logs und berechnen die 5 wichtigsten Hashtags pro Tag, die mit positiven Stimmungsmeldungen (Smileys) verbunden sind. Sie können sich vorstellen, wie Sie dies auf eine einfache Stimmungsanalyse Ihres (potenziellen) Kundenfeedbacks ausweiten können.

Sammeln Sie die Daten der Twitter Streaming API Die JSON-Protokollzeilen der Twitter Streaming API sehen wie folgt aus:

[java]
{
"created_at": "Sat Sep 10 22:23:38 +0000 2011",
"id_str": "112652479837110273",
"text": "@twitter meets @seepicturely at #tcdisrupt cc.@boscomonkey @episod https://t.co/6J2EgYM",
...
"user": {
"name": "Eoin McMillan ",
"screen_name": "imeoin",
...
}
...
}
[/java]

Im Moment interessieren wir uns nur für die Attribute "created_at" und "text". Detaillierte Informationen zu allen verfügbaren Attributen finden Sie im Twitter API v2 data dictionary

Rohdaten in Hadoop & Hive importieren Importieren Sie nun von der Hive-Konsole aus die Protokolle in eine Hive-Tabelle.

[java]
create table raw_tweets (json string);
load data local inpath 'sample.json' into table raw_tweets;
[/java]

Bei Hadoop ist es ein bewährtes Verfahren, die Rohdaten immer aufzubewahren. Es kommt nicht selten vor, dass Sie Tage später obskure Parse-Fehler oder fehlende Informationen entdecken. Wenn Sie die Quelldaten aufbewahren, können Sie diese ohne großen Aufwand korrigieren. Parsen Sie JSON-Tweets und extrahieren Sie relevante Informationen Aus diesen Rohdaten parsen und extrahieren wir die eigentlichen Informationen, die uns interessieren. Mit der Funktion get_json_object können wir über eine XPath-ähnliche Abfrage des JSON-Objekts auf die Attribute "text" und "created_at" zugreifen. Der Zeitstempel muss für die spätere Formatierung in das Unix-Epochenformat konvertiert werden.

[java]
create table tweets as
select get_json_object(json, "$.text") as text,
unix_timestamp(get_json_object(json, "$.created_at"),
"EEE MMM d HH:mm:ss Z yyyy") as ts_created
from raw_tweets;
[/java]

Parsen von Text, Extrahieren von Hashtags und Identifizierung der Stimmung Nachdem wir nun die Quelldaten in einem Format erhalten haben, mit dem wir umgehen können (Text, Zeitstempel), ist es an der Zeit, die Stimmungsinformationen zu identifizieren. Für diesen Fall stellen wir einen regulären Ausdruck zusammen, der auf einige positive Smileys passt: :) :-) ;) und ;-). Sie können diesen Ausdruck gerne nach Ihrem Geschmack erweitern. Außerdem teilen wir den Text auf Leerzeichen auf und identifizieren Begriffe, die wie ein #hashtag aussehen. Diese übereinstimmenden Hashtags geben wir zusammen mit dem Datum im Format JJJJ-MM-TT aus, damit wir anschließend tägliche Aggregationen vornehmen können.

[java]
create table positive_hashtags_per_day as
select from_unixtime(ts_created, 'yyyy-MM-dd') as dt,
lower(hashtag) as hashtag from tweets
lateral view explode(split(text, ' ')) b as hashtag
where ts_created is not null
and hashtag rlike "^#[a-zA-Z0-9]+$"
and text rlike "^.*[;:]-?\).*$";
[/java]

Vorkommen pro Tag aggregieren Die Aggregation ist ganz einfach: Sie müssen nur die Vorkommen pro Tag zählen. Wenn Sie nun mehrere Aggregationen (pro Woche, pro Monat usw.) vornehmen möchten, sollten Sie die Erstellung der Datumszeichenfolge in diesen Schritt verschieben.

[java]
create table count_positive_hashtags_per_day as
select dt, hashtag, count(*) as cnt from positive_hashtags_per_day
group by dt, hashtag;
[/java]

Begrenzen Sie die Top 5 Ergebnisse pro Tag mit einem externen Reducer Schließlich wollen wir nur die Top 5 Ergebnisse pro Tag. Dies ist in Hive etwas schwierig, da dafür eine benutzerdefinierte Funktion oder ein Streaming-Reducer-Aufruf erforderlich ist. Letzteres machen wir mit einem kleinen Stück Python-Code, der nur die ersten 5 Ergebnisse pro Schlüsselwort zurückgibt. Da die Eingabe für den Reducer-Aufruf bereits sekundär nach der Anzahl in absteigender Reihenfolge sortiert ist, werden die ersten 5 Ergebnisse zurückgegeben - genau wie wir es wollen.

[java]
add file topN.py;
create table top5_positive_hashtags_per_day as
reduce dt, hashtag, cnt
using 'topN.py 5' as dt, hashtag, cnt
from
(select dt, hashtag, cnt from count_positive_hashtags_per_day
distribute by dt sort by dt, cnt desc) cnts;
[/java]

Der Python-Reduce-Code sieht wie folgt aus. Aufgrund der Funktionsweise der Hadoop Streaming API müssen Sie die Schlüsselgrenzen selbst erkennen.

[java]
#!/usr/bin/env python
# Reducer that returns the top N results per keyword
import sys
maxN = int(sys.argv[1])
last_key = None
count = 0
for line in sys.stdin:
(key, value) = line.strip().split("t", 1)
if key != last_key:
count = 0
last_key = key;
if count < maxN:
print "%st%s" % (key, value)
count += 1
[/java]

Ergebnisse Die Ergebnisse dieser Übung an meiner kleinen Stichprobe (ich kann die Quelle gemäß den Twitter TOS nicht weitergeben): hive> select * from top5_positive_hashtags_per_day; OK 2011-02-25 #ff 8 2011-02-25 #happy 3 2011-02-25 #followfriday 2 2011-02-25 #teamzeeti 2 2011-02-25 #baensv 1 2011-02-26 #db40birthday 5 2011-02-26 #bieberfact 2 2011-02-26 #teamfollowback 2 2011-02-26 #feelingsoo 1 2011-02-26 #aktf 1 2011-02-27 #1 2 2011-02-27 #12 1 2011-02-27 #27f 1 2011-02-27 #dvdmeb 1 2011-02-27 #fail 1 Zeitaufwand: 4.231 Sekunden Follow Freitags machen Menschen glücklich... wer hätte das gedacht :) Laden Sie den vollständigen Code herunter und folgen Sie @mids106

Verfasst von

Joris Bontje

Contact

Let’s discuss how we can support your journey.