最近在研究列式存储文件格式,所以就研究了下apache parquet格式.下面将讲下该格式相关东西,慢慢更新.
因为我是用spark去读写parquet的,所以下面的分析会涉及部分spark源码.
在spark输出parquet有两个版本,v1和v2. 这两个版本主要是在数据编码上有区别,其中v1没有用最新的rlebit算法,压缩上表现可能会差点.注意:默认的是v1版本.
spark写parquet有两个版本,默认是v1.
org.apache.parquet.column.impl.ColumnWriteStoreV1
org.apache.parquet.column.impl.ColumnWriteStoreV2
package org.apache.parquet.hadoop;
public class ParquetOutputFormat<T> extends FileOutputFormat<Void, T> {
public static WriterVersion getWriterVersion(Configuration configuration) {
String writerVersion = configuration.get(
WRITER_VERSION, ParquetProperties.DEFAULT_WRITER_VERSION.toString());
return WriterVersion.fromString(writerVersion);
}
}
上面这个代码在写parquet的时候会获取写的版本,但是由于没设置,所以得的结果就是默认的v1. 我找了一圈,发现了如何设置写v2版本.下面是设置代码.注意一定是要在最开始创建spark的就配置,中途在conf设置是不生效的.
val spark = SparkSession.builder().appName("test").config( "spark.hadoop.parquet.writer.version", "v2").getOrCreate
2. parquet文件大小问题,一般一个很大的文件转成parquet, 是会生成很多parquet子文件的,那么如何控制单个子文件的输出大小呢?
一般单个parquet文件中包括很多row group(block), parquet默认控制了耽搁block大小,但是没控制单个parquet大小,造成单个parquet文件有时候会很大.
其中可以通过设置参数调整
spark.conf.set("spark.sql.files.maxRecordsPerFile", "1000") //这里设置的是1000条记录