PySpark如何读取具有多种编码字符串的文件

Har*_*ish 6 python apache-spark pyspark

我正在编写一个python spark实用程序来读取文件并进行一些转换。文件包含大量数据(最大12GB)。我使用sc.textFile创建一个RDD,逻辑是将RDD中的每一行传递到一个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')
Run Code Online (Sandbox Code Playgroud)

但是当我将数据写回文件时,此字段将转换为“Priv�”。在Linux上,源文件类型显示为“ ISO-8859文本,具有很长的行,带有CRLF行终止符”。

有人可以让我知道在Spark中使用混合编码读取/写入文件的正确方法。

zer*_*323 3

调用时可以设置use_unicode为。它将为您提供对象 (Python 2.x) 或对象 (Python 3.x) 的 RDD,可以使用所需的编码进一步处理,例如FalsetextFilestrbytes

sc.textFile(path, use_unicode=False).map(lambda x: x.decode("iso-8859-1"))
Run Code Online (Sandbox Code Playgroud)

如果这还不够,可以使用以下方式加载数据binaryFiles

sc.binaryFiles(path).values().flatMap(lambda x: x.decode("iso-8859-1").splitlines())
Run Code Online (Sandbox Code Playgroud)