You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:37:22