PySpark导入LZO压缩CSV文件返回全Null值问题求助
解决PySpark读取LZO压缩CSV/TSV文件返回全Null的问题
我来帮你搞定这个LZO压缩文件读取的坑!你遇到的全Null问题,核心原因是PySpark默认没有内置LZO压缩的支持——虽然你本地装了lzop命令行工具,但Spark依赖的是Java实现的Hadoop LZO编解码器,和系统的lzop不是一回事。下面是具体的解决步骤:
1. 先搞定Spark的LZO依赖包
Spark本身不带LZO编解码器,你需要添加hadoop-lzo的jar包到Spark的类路径中:
- 如果是本地开发环境:下载和你的Spark依赖的Hadoop版本匹配的
hadoop-lzojar(比如对应版本的com.hadoop.gplcompression:hadoop-lzo),放到Spark安装目录的jars文件夹里。 - 如果是通过命令行启动PySpark:可以用
--jars参数指定jar路径,比如pyspark --jars /path/to/hadoop-lzo.jar。
2. 配置SparkSession启用LZO编解码器
在创建SparkSession的时候,需要添加Hadoop压缩相关的配置,让Spark能识别LZO格式:
import pyspark as ps from pyspark.conf import SparkConf # 配置支持LZO的压缩编解码器 conf = SparkConf() conf.set("spark.hadoop.io.compression.codecs", "org.apache.hadoop.io.compress.GzipCodec," "org.apache.hadoop.io.compress.DefaultCodec," "org.apache.hadoop.io.compress.BZip2Codec," "com.hadoop.compression.lzo.LzoCodec," "com.hadoop.compression.lzo.LzopCodec") conf.set("spark.hadoop.io.compression.codec.lzo.class", "com.hadoop.compression.lzo.LzopCodec") # 创建带配置的SparkSession spark = ps.sql.SparkSession.builder.master("local[2]").config(conf=conf).getOrCreate()
3. 正常读取压缩文件
确保你的LZO压缩文件后缀是.lzo(比如data.tsv.lzo),这样Spark会自动识别压缩格式,然后就可以用你原来的读取代码了:
# 读取LZO压缩的TSV文件(schema和文件路径保持你原来的定义) data = spark.read.csv(fp, schema=SCHEMA, sep="\t") # 验证数据是否正常加载 data.show()
额外小提示
如果你的压缩文件没有.lzo后缀,也可以尝试手动指定压缩格式,但Spark的csv读取器的compression参数可能不直接支持lzo——所以最稳妥的方式还是给文件加上.lzo后缀,让Spark自动匹配编解码器。
内容的提问来源于stack exchange,提问作者Gianluca Micchi
相关产品推荐
相关产品推荐

