【问题标题】:Spark Python map function: Error in encoding utf-8Spark Python映射函数:编码utf-8时出错
【发布时间】:2016-08-02 13:18:15
【问题描述】:

我一直在尝试使用 Python 处理文本文件。我的文本文件是使用 UTF-8 的越南人的母语。使用 map 功能后,输出似乎格式不正确。我已经将代码分开并逐步输出。我注意到在 map word: (word, 1) 之后编码出错了。更准确地说,直到 output7.txt,文本是: Đức đã 恩甘 gục

但是,在输出 8 处,编码出错了:

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

应该是 (Đức, 1) (đã, 1) (ngã, 1) (gục, 1)

我已尝试修复此错误 5 小时,但没有发现任何真正有用的东西。谁能告诉我为什么 Map 功能破坏了一切,而类似的 FlatMap 功能却可以正常工作?

谢谢。下面是我的源代码。

> #!/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")

【问题讨论】:

    标签: python python-2.7 apache-spark encoding utf-8


    【解决方案1】:

    这里的编码没有什么特别的错误。你只是保存了一个错误的东西。如果你想保存一个正确的 Unicode 表示,你应该自己准备一个:

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

    【讨论】:

    • 感谢您的解释,但是我发现它有点难以理解,因为我在 Spark 中搜索 Python API 我还没有看到格式方法。你能详细说明一下吗?非常感谢
    • format 是标准的 Python 字符串方法:docs.python.org/2/library/stdtypes.html#str.format
    • 我添加了代码并且它有效,我仍在尝试理解那是什么。非常感谢。
    • 基本上区别在于采用(u'\u0111\xe3', 1) 的字符串表示和连接u'\u0111\xe3'u'1'
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2017-11-08
    相关资源
    最近更新 更多