背景
前面写过几篇关于flink入库的文章,但是还有个通点一直未解决,那就是小文件问题。好在1.12版本已经支持了小文件合并,但是在使用时发现问题了,parquet居然不支持读复杂类型,这就有点蛋疼了。那么我们就来尝试解决他。
1.11现状
使用parquet读filesystem依赖于ParquetFileSystemFormatFactory#createReader来创建InputFormat,目前的实现是其内部类ParquetInputFormat,更进一步是使用ParquetColumnarRowSplitReader来进行读的。在其构造方法里面有个checkSchema方法来检查schema的类型,如果有复杂类型就会抛出异常。
我们尝试扩展ParquetInputFormat来实现读复杂类型,因为这个类的实现是借助了ParquetRecordReader来读并且转换成了Row类型,Row是支持各种复杂类型的。
不在ParquetColumnarRowSplitReader基础上扩展的另一个原因是它转换后的类型是ColumnarRowData,对复杂类型的支持比较困难。
具体实现
1.实现一个ParquetRowDataInputFormat
2.在ParquetFileSystemFormatFactory#createReader时返回ParquetRowDataInputFormat
详细代码请见:代码
注:由于我们还是使用的1.11.1版本,所以是吧小文件合并的相关代码merge进来的,在merge过程中需要做适当修改,因为1.12的实现是基于source接口重构后的,不知道如何修改的可以私信。