Presto读取Parquet文件的流程

   一.  概论

        Presto对ORC和Parquet格式存储的Hive表的处理很为友好,Presto访问这两种格式表时进行了大量的优化,以致得到很为优越的性能。 Presto在读取文件上和Spark等其他数据处理引擎组件最为与众不同是Presto读取ORC/Parquet格式表并没有采用传统的MR方式,而是采用了自己读取和切分和转换文件的方式。这样很容易实现自己控制多worker多并发读取,多pipeline同时加工,也能很容易进行列裁剪分区裁剪等读取优化,可以有效避免读取数据成为数据处理的性能瓶颈。

      本文主要介绍了在Presto读取Parquet文件的流程以及介绍在Presto中是如何一步步将Parquet文件组装成自己数据加工处理的数据结构Page的。

二.  Presto读取Parquet文件的总体流程

三. Presto处理Parquet文件的代码走读

ParquetPageSource
   getNextPage
       blocks[fieldId] = new LazyBlock(batchSize, new ParquetBlockLoader(field.get()));
           ParquetBlockLoader::load
               parquetReader.readBlock(field)
                  columnChunk = readPrimitive((PrimitiveField) field)   //对于以下嵌套的数据格式处理过程会更加复杂
                      columnReader.readPrimitive(field);
                         readNextPage();
                            valuesReader = readPageV1((DataPageV1) page);  //这里利用了Parquet的接口读取Parquet的原生数据
                        readValues(...);
                        readValue(blockBuilder, type)
                             根据列的类型选择对应的BinaryColumnReader/BinaryColumnReader/DoubleColumnReader/FloatColumnReader将parquet类型转换成presto类型的适配器,以string类型的适配器BinaryColumnReader为例:
                           BinaryColumnReader.readValue
                              type.writeSlice(blockBuilder, value)
                                   CharType::writeSlice
                                       blockBuilder.writeBytes  //至此,数据已经从parquet读出来并且转成成了presto类型,并且填充到了block了
     return new Page(batchSize, blocks)   // Page此刻已经组装完成,presto会将其add到下游的Operation进行处理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值