Spark环境下如何向RCFile格式Hive表写入snappy压缩数据
RCFile格式Hive表Snappy压缩写入解决方案
RCFile属于Hive原生适配的存储格式,压缩配置不使用Spark专属的格式参数,而是走Hadoop、Hive的公共配置体系,所以你之前针对Parquet的配置方式不适用。
可用解决方案
方案1:表级配置(推荐,永久生效)
提前创建目标表时直接指定snappy压缩属性,后续所有向该表的写入操作都会自动用snappy压缩,不需要每次任务单独配置:
CREATE TABLE schema_name.rc_table_name LIKE schema_name.origin_table STORED AS RCFILE TBLPROPERTIES ( "rcfile.compression" = "SNAPPY", "rcfile.compression.codec" = "org.apache.hadoop.io.compress.SnappyCodec" );
建表完成后直接执行你之前的插入语句即可:
spark.sql("insert into table schema_name.rc_table_name select * from schema_name.origin_table")
方案2:会话级临时配置(无需修改表结构)
如果不想改动表的元数据,仅需要当前Spark任务写入时生效,在执行插入操作前先设置以下三个配置:
# 开启Hive输出压缩开关 spark.sql("set hive.exec.compress.output=true") # 指定压缩编码为Snappy spark.sql("set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec") # 指定压缩粒度为块级(RCFile建议用块压缩获得更高压缩率) spark.sql("set mapred.output.compression.type=BLOCK")
配置完成后再执行插入语句,写入的RCFile文件就会自动采用snappy压缩。
原有操作失败/不生效原因
- 方法1中
df.write.option("compression", "snappy")仅对Spark原生支持的存储格式(Parquet、ORC、CSV等)生效,RCFile不识别该参数,所以直接运行报错。 - 方法2没有开启对应的压缩配置,Hive默认采用无压缩写入,所以生成的文件没有被压缩。
内容的提问来源于stack exchange,提问作者duty sloth
相关产品推荐
相关产品推荐

