Spark ORC追加模式是否排序文件?元数据及模式差异问询
ORC文件的列统计元数据与追加写入机制解析
核心疑问
- ORC的列级聚合统计(count、min、max、sum)是否仅在列排序后才有实用价值?未排序时元数据作用是不是很低?
- 使用追加模式写入ORC文件存储时,会不会对整个文件列表排序后重写?追加模式和非追加模式的区别是什么?
问题解答
1. ORC列统计元数据的实用范围
ORC的列级统计(文件和stripe层级的count、min、max、sum)并非仅在列排序后才有用:
- 就算列没排序,只要过滤条件的范围能完全排除某些stripe或文件,元数据依然能发挥作用。比如某stripe的max值远小于过滤条件的下限,就能直接跳过这个stripe的扫描,不用读取实际数据块。
- 当然,排序后的列会让min/max的范围更精准,过滤效率会更高;未排序时范围确实会偏大,但只要存在能被过滤掉的块,元数据就有实际价值,只是效率不如排序后的场景。
2. ORC追加写入的行为与模式区别
- 追加模式绝对不会对现有文件列表排序重写。执行代码:
时,Spark会直接在目标目录下新增独立的ORC文件,完全不会修改已有的任何文件。dataframe.write.mode("append").format("orc").save("mydata.orc") - 追加模式和其他写入模式的核心区别:
append:保留目录下所有已有文件,新增数据以全新ORC文件的形式写入,不会改动原有数据的结构和内容,也不会对整体数据做排序操作。overwrite:清空目标目录下所有已有文件,将当前DataFrame完整写入为新的ORC文件集合。error(默认模式):如果目标目录已存在,直接抛出异常,终止写入操作。ignore:如果目标目录已存在,直接跳过写入流程,不做任何操作。
内容的提问来源于stack exchange,提问作者olaf
相关产品推荐
相关产品推荐

