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如何读取具有多种编码的字符串的文件的主要内容,如果未能解决你的问题,请参考以下文章

具有多种数据类型的 Pyspark SQL 数据帧映射

如何读取具有 ANSI 编码和非英文字母的文本文件?

如何在读取前根据定义的模式读取 pyspark 中的镶木地板文件?

pyspark用正则表达式读取csv文件

使用 pyspark 读取多个 csv 文件

在Pyspark中使用时,具有静态文件依赖性的python包无法读取静态文件