PySpark如何读取具有多种编码的字符串的文件
Posted
技术标签:
【中文标题】PySpark如何读取具有多种编码的字符串的文件【英文标题】:PySpark how to read file having string with multiple encoding 【发布时间】:2016-09-01 18:44:37 【问题描述】:我正在编写一个 python spark 实用程序来读取文件并进行一些转换。 文件有大量数据(高达 12GB)。我使用 sc.textFile 创建一个 RDD,逻辑是将每一行从 RDD 传递给一个映射函数,该函数又将行拆分为“,”并运行一些数据转换(根据映射更改字段值)。
文件中的示例行。 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 中读取/写入混合编码文件的正确方法。
【问题讨论】:
【参考方案1】:您可以在调用textFile
时将use_unicode
设置为False
。它将为您提供 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())
【讨论】:
以上是关于PySpark如何读取具有多种编码的字符串的文件的主要内容,如果未能解决你的问题,请参考以下文章