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执行引擎执行。
优化
- 裁列 – 只读所需列,而不是所有列
- 没有行列转换,直接将Parquet列格式转化为Presto列格式。
- 利用Footer中的元数据,在特定列不在Row Group中列区间时,跳过这个Group
- 利用Footer中的Row Group级别的列值字典,不在字典中的city_id的group跳过。
- 只有有断言filter后有数据的group才生成Parquet数据块。