2017-12-29 13 views
-1

Ich habe eine JSON-Datei mit dem folgenden Format, die ich in pyspark Dataframe konvertiert. Konvertierter Datenrahmen ist wie folgt.Konvertieren einer JSON-Datei in pyspark Datenframe und dann zu RDD

Im Folgenden finden Sie die Tweets Datenrahmen:

+-------------+--------------------+-------------------+ 
|  tweet_id|    tweet|    user| 
+-------------+--------------------+-------------------+ 
|1112223445455|@xxx_yyyzdfgf @Yoko |    user_1| 
|1112223445456|sample test tweet |    user_2| 
|1112223445457|test mention @xxx_y |    user_1| 
|1112223445458|testing @yyyyy  |    user_3| 
|1112223445459|@xxx_yyzdfgdd @frnd |    user_4| 
+-------------+--------------------+-------------------+ 

ich jetzt zu extrahieren versuche alle Erwähnungen (Wörter, die mit einem „@“ beginnen) aus der Säule - Tweet.

Ich habe es getan, indem ich es in eine RDD umwandelte und alle Zeilen unter Verwendung des folgenden Codes spaltete.

tweets_rdd = tweets_df.select("tweet").rdd.flatMap(list) 
tweets_rdd_split=tweets_rdd.flatMap(lambda text:text.split(" ")).filter(lambda word:word.startswith('@')).map(lambda x:x.split('@')[1]) 

Jetzt ist meine Ausgabe im unteren Format.

[u'xxx_yyyzdfgf', 
u'Yoko', 
u'xxx_y', 
u'yyyyy', 
u'xxx_yyzdfgdd', 
u'frnd'] 

Jede Zeile hat die innerhalb u' ' erwähnt. Ich denke, es erscheint, weil die Ausgangsdatei eine JSON-Datei ist. Ich habe versucht, es mit Funktionen wie Teilen und Ersetzen zu entfernen. Aber es funktioniert nicht. Könnte mir jemand helfen, diese zu entfernen?

Gibt es einen besseren Ansatz als das, um die Erwähnungen zu extrahieren?

Antwort

1

Der Anfang ist, weil es ein Unicode-Objekt ist. Sie können es einfach in String-Format konvertieren.

Sie können sich darauf beziehen, um den Unterschied zwischen Unicode und String zu verstehen. What is the difference between u' ' prefix and unicode() in python?

können Sie die Spalten Karte eine Lambda-Funktion

tweets_rdd_split = tweets_rdd_split.map(lambda x: str(x)) 
+0

Großartig. Ich danke dir sehr. Es hat wie erwartet funktioniert. –

+0

Nach dem Hinzufügen der oben genannten, bekomme ich einen Unicode-Fehler. Fehler ist UnicodeEncodeError: 'Ascii' Codec kann nicht das Zeichen u '\ u2026' in Position 0 codieren: ordinal nicht im Bereich (128) .. irgendeine Idee, wie man das anspricht? –

+0

Ich löste es mit encode() statt mit str (x). Danke für die Hilfe –

1

Anfangs i mit

versucht
tweets_rdd_split = tweets_rdd_split.map(lambda x: str(x)) 

wie pisall vorgeschlagen durch die Unicodes entfernen.

Es gab jedoch fremde Zeichen im Tweet, die bei der Verwendung von str (x) einen Codierungsfehler verursachten. Daher habe ich das Folgende verwendet, um dieses Problem zu beheben.

tweets_rdd_split = tweets_rdd_split.map(lambda x: x.encode("ascii","ignore")) 

Dies löste das Codierproblem.