ORC 在map阶段读取数据并进行切分的策略有三种BI、ETL、HYBRID。
ETL策略会将文件(OrcFile)进行切分(以stripe为粒度),多个stripe组成一个split;
BI策略直接以Block为粒度进行split划分(跳过stripe);
HYBRID策略为:当文件的平均大小大于hadoop最大split值(默认256 * 1024 * 1024)时使用ETL策略,否则使用BI策略。
优缺点:
因为ETL以stripe为粒度切分,所以需要读取File Footer(元数据)到内存,当这个表很大的时候(OCRFile很大),File Footer也很大,可能造成切片失败(driver端OOM)。
但BI策略是以Hdfs的Block进行切分的,所以不需要读取ORC元数据,节约性能,但ETL可以更细粒度的切分,如果不在意切分性能的话。
因此对于一些较大的ORC表的读取建议使用BI策略。对于一些较小的尤其有数据倾斜的表(这里的数据倾斜指大量stripe存储于少数文件中),建议使用ETL策略。