PySpark:如何为sc.newAPIHadoopFile配置编码格式?
直接给sc.newAPIHadoopFile()传递编码格式的方法
当然可以直接通过sc.newAPIHadoopFile()指定ISO-8859-1编码!因为这个方法底层依赖Hadoop的输入格式组件,我们只需要通过Hadoop的配置参数来指定文本编码即可。
具体步骤和代码示例
- 获取SparkContext对应的Hadoop配置对象,设置编码相关的配置项
- 调用
newAPIHadoopFile()时,这个配置会自动应用到文件读取操作中
from pyspark import SparkContext # 初始化或获取已有的SparkContext sc = SparkContext.getOrCreate() # 获取Hadoop配置并设置ISO-8859-1编码 hadoop_conf = sc._jsc.hadoopConfiguration() # 针对TextInputFormat的专用编码配置项,优先级更高 hadoop_conf.set("textinputformat.encoding", "ISO-8859-1") # 也可以设置通用的文件编码配置,不过前者更精准 # hadoop_conf.set("fs.file.encoding", "ISO-8859-1") # 使用newAPIHadoopFile读取文件 # 指定TextInputFormat作为输入格式,key是行号,value是每行文本内容 rdd = sc.newAPIHadoopFile( path="/path/to/your/iso-8859-1-file", inputFormatClass="org.apache.hadoop.mapreduce.lib.input.TextInputFormat", keyClass="org.apache.hadoop.io.LongWritable", valueClass="org.apache.hadoop.io.Text" ) # 后续将RDD转换为DataFrame,再处理生成Parquet文件 df = rdd.map(lambda row: (row[1],)).toDF(["raw_content"]) df.write.parquet("/path/to/output.parquet")
原理说明
textinputformat.encoding是Hadoop的TextInputFormat类专门用于指定读取文本文件时字符编码的配置参数。通过SparkContext的_jsc.hadoopConfiguration()获取底层Hadoop配置并设置该参数后,newAPIHadoopFile()在读取文件时就会使用ISO-8859-1编码解析文本内容,避免乱码问题。
补充提醒
虽然这种方法可行,但如果你的文件是结构化CSV数据,你提到的spark.read.csv()配合encoding选项的方式会更简洁——它不需要手动处理RDD到DataFrame的转换,还能直接指定Schema、分隔符等CSV相关参数。不过如果因为特定场景必须使用newAPIHadoopFile(),上面的方案完全可以满足需求。
内容的提问来源于stack exchange,提问作者SwapnilM
相关产品推荐
相关产品推荐

