2016-08-02 14 views
0

Ich habe versucht, eine Textdatei mit Python zu verarbeiten. Meine Textdatei ist in der Muttersprache von Vietnamesen, die UTF-8 verwenden. Nachdem ich die Map-Funktion verwendet habe, scheint die Ausgabe nicht mehr zu formatieren. Ich habe den Code getrennt und Schritt für Schritt ausgegeben. Ich stelle fest, dass die Codierung nach dem Kartenwort falsch ist: (Wort, 1). Um genauer zu sein, bis zu output7.txt, der Text war: Đức đã Nga GUCSpark Python Kartenfunktion: Fehler beim Verschlüsseln von utf-8

jedoch am Ausgang 8 die Codierung falsch gelaufen ist:

(u '\ u0110 \ u1ee9c', 1) (u '\ u0111 \ XE3', 1) (u'ng \ XE3' , 1) (u'g \ u1ee5c‘, 1)

es soll sein (Đức, 1) (đã, 1) (ngã, 1) (gục, 1)

Ich habe versucht, diesen Fehler für 5 Stunden zu beheben, aber nichts wirklich Nützliches gefunden. Kann mir jemand sagen, warum die Map-Funktion alles zerstört hat, während die ähnliche FlatMap-Funktion gut funktioniert?

Vielen Dank. Unten ist mein Quellcode.

> #!/usr/bin/python 
# -*- coding: utf8 -*- 
from pyspark import SparkContext, SparkConf 
import os, sys 
import codecs 

conf =SparkConf().setAppName("wordcount").setMaster("local") 
sc = SparkContext(conf=conf) 

reload(sys) 
sys.setdefaultencoding('utf-8') 

text_file = sc.textFile("outputtest/*",use_unicode=False) 
dict_file = sc.textFile("keyword"); 

text_file.saveAsTextFile("Output6.txt") 

counts = text_file.flatMap(lambda line: line.split(" ")) 
counts.saveAsTextFile("Output7.txt") 

counts = counts.map(lambda word: (word.decode("utf-8"), 1)) 
counts.saveAsTextFile("Output8.txt") 

counts= counts.reduceByKey(lambda a, b: a + b) 
dicts = dict_file.flatMap(lambda line: line.split(", ")) \ 
       .map(lambda word: (word.replace("'","").replace(" ","_"))) 

keyword = dicts.join(counts);     

counts.saveAsTextFile("Output9.txt") 

Antwort

1

Hier ist nichts besonders falsch mit der Codierung. Sie speichern einfach eine falsche Sache. Wenn Sie eine richtige Unicode-Darstellung speichern möchten, sollten Sie selbst eine Beurteilung vorbereiten:

counts.map(lambda x: u"({0}, {1})".format(*x)).saveAsTextFile(...) 
+0

Dank für die explaination, aber ich fand es ein bisschen schwer zu verstehen, wie ich für Python-API in Spark-Suche habe ich nicht gesehen Formatmethode. Könntest du das ausarbeiten? Vielen Dank – TheCyberliem

+1

'Format' ist eine Standard-Python-String-Methode: https://docs.python.org/2/library/stdtypes.html#str.format – zero323

+0

Ich habe den Code hinzugefügt und es funktioniert, ich versuche immer noch Versteh was das war. Danke vielmals. – TheCyberliem