我正在编写一个python spark实用程序来读取文件并进行一些转换。 文件有大量数据(最大12GB)。我使用sc.textFile创建RDD,逻辑是将每行从RDD传递给map函数,map函数依次将行拆分为“,”并运行一些数据转换(根据映射更改字段值)。
文件中的示例行。 0014164,02,031270,09,1,0,0,0000000000,134314,移动,ce87862158eb0dff3023e16850f0417a-cs31,584e2cd63057b7ed,Privé的,闲话
由于值“Privé”,我得到UnicodeDecodeError。我试着跟随解析这个值:
if isinstance(v[12],basestring):
v[12] = v[12].encode('utf8')
else:
v[12] = unicode(v[12]).encode('utf8')
但是当我将数据写回文件时,此字段会被翻译为“Priv�”。 在Linux源文件类型显示为“ISO-8859文本,具有很长的行,与CRLF行终止符”。
有人可以让我知道在Spark中使用混合编码来读/写文件的正确方法。
答案 0 :(得分:1)
调用use_unicode
时,您可以将False
设置为textFile
。它将为您提供str
对象(Python 2.x)或bytes
对象(Python 3.x)的RDD,可以使用所需的编码进一步处理,例如
sc.textFile(path, use_unicode=False).map(lambda x: x.decode("iso-8859-1"))
如果没有足够的数据可以使用binaryFiles
sc.binaryFiles(path).values().flatMap(lambda x: x.decode("iso-8859-1").splitlines())