LawrencePeng's Blog

专注收集代码小精灵

Parquet和Presto的故事

Parquet

Parquet是成熟的列式存储文件格式,数据以row groups分为partitions,每个partition的数据以列分别存储,Footer存储了每个块的元数据信息。以各种压缩算法来压缩数据。

Presto

Presto是开源的分布式SQL查询引擎。本身不store数据,通过reader读到执行引擎中。可以实现不同类型数据库的join。

故事

之前的Parquet Reader For Presto(后面简称PRFP)没有完全地利用Parquet的优势,所以Uber Team改进了其设计。

假设执行SQL为

SELECT base.driver_uuid FROM rawdata.schemaless_mezzanine_trips_rows WHERE datestr = ‘2017-03-02’ AND base.city_id in (12)

原来的PRFP会分三步走: 1. 以行为单位用Parquet的开源库读所有数据。2. 将行格式转化为Presto的列式内存块。3. 根据断言base.city_id = 12 来过滤这些block,然后就丢给Presto执行引擎执行。

优化

  1. 裁列 – 只读所需列,而不是所有列
  2. 没有行列转换,直接将Parquet列格式转化为Presto列格式。
  3. 利用Footer中的元数据,在特定列不在Row Group中列区间时,跳过这个Group
  4. 利用Footer中的Row Group级别的列值字典,不在字典中的city_id的group跳过。
  5. 只有有断言filter后有数据的group才生成Parquet数据块。