PySpark读取ANSI编码固定宽文件编码异常如何解决?
PySpark读取ANSI编码固定长度文件的编码异常解决方法
问题背景
读取一份ANSI编码(对应windows-1252/ISO-8859-1)的固定长度非CSV文件时,使用PySpark初始代码加载为DataFrame出现编码异常,数据中出现乱码字符。尝试在读取阶段指定encoding参数的方案无效,最终通过decode函数处理后解决问题。
初始问题代码
以下是最初的加载代码,执行后会出现编码乱码:
def Cria_df(d_spark, d_minio_client, d_bucket, d_arquivo, d_schema): # 尝试过指定ISO-8859-1 / windows-1252编码,但无效 df = d_spark.read.text("s3a://"+d_bucket+"/"+d_arquivo) df.show() # 注释掉的是尝试过的无效方案: # df = d_spark.read.option('encoding', 'windows-1252').text("s3a://"+d_bucket+"/"+d_arquivo, encoding="latin1") for colinfo in d_schema: df = df.withColumn(colinfo[0],df.value.substr(colinfo[1],colinfo[2])) header=df.first()[0] df = df.filter(~col("value").contains(header)) df = df.drop('value') return df
无效尝试
在spark.read.text()方法中通过option('encoding', 'windows-1252')或直接指定encoding="latin1"参数,无法解决编码乱码问题。
有效解决方案
通过在读取文件后,使用PySpark的decode函数对value列进行编码转换,指定windows-1252编码,成功解决乱码问题。修改后的代码如下:
def Cria_df(d_spark, d_minio_client, d_bucket, d_arquivo, d_schema): # 编码对应:ANSI -> windows-1252/ISO-8859-1 df = d_spark.read.text("s3a://"+d_bucket+"/"+d_arquivo) # 关键修复:用decode函数转换编码 df = df.withColumn('value', decode(df.value, "windows-1252")) # 注释掉的是之前的无效尝试 # df = d_spark.read.option('encoding', 'windows-1252').text("s3a://"+d_bucket+"/"+d_arquivo, encoding="latin1") for colinfo in d_schema: df = df.withColumn(colinfo[0],df.value.substr(colinfo[1],colinfo[2])) header=df.first()[0] df = df.filter(~col("value").contains(header)) df = df.drop('value') # df.show() return df
内容的提问来源于stack exchange,提问作者fabio jr
相关产品推荐
相关产品推荐

