正确编码sc.textFile数据(python 2.7)
问题描述:
我的CSV最初是由Excel创建的。预计编码异常,我打开并重新保存文件与UTF-8 BOM encoding
使用Sublime文本。正确编码sc.textFile数据(python 2.7)
导入到笔记本:
filepath = "file:///Volumes/PASSPORT/Inserts/IMAGETRAC/csv/universe_wcsv.csv"
uverse = sc.textFile(filepath)
header = uverse.first()
data = uverse.filter(lambda x:x<>header)
格式化我的领域:
fields = header.replace(" ", "_").replace("/", "_").split(",")
结构化数据:
import csv
from StringIO import StringIO
from collections import namedtuple
Products = namedtuple("Products", fields, verbose=True)
def parse(row):
reader = csv.reader(StringIO(row))
row = reader.next()
return Products(*row)
products = data.map(parse)
如果我那么做products.first()
,我会得到第一笔记录。但是,如果我想,说,看count by brand
等运行:
products.map(lambda x: x.brand).countByValue()
我仍然得到了UnicodeEncodeError
相关Py4JJavaError
:
File "<ipython-input-18-4cc0cb8c6fe7>", line 3, in parse
UnicodeEncodeError: 'ascii' codec can't encode character u'\xab' in
position 125: ordinal not in range(128)
我怎样才能解决这个代码?
答
csv
传统Python版本中的模块不支持Unicode输入。个人而言,我会建议使用星火csv
数据来源:
df = spark.read.option("header", "true").csv(filepath)
fields = [c.strip().replace(" ", "_").replace("/", "_") for c in df.columns]
df.toDF(*fields).rdd
对于大多数应用对象应该工作以及namedtuple
(它扩展tuple
,并提供了类似属性的getter),但你可以轻松地跟踪一个转换到另一个。
您也可以尝试读取数据,而无需解码:
(data
.map(parse)
.map(lambda prod: Products(*[x.decode("utf-8") for x in prod])))
相关问题Reading a UTF8 CSV file with Python
:uverse = sc.textFile(filepath, use_unicode=False)
和解码领域的初步分析后手动