我正在研究Spark优化方法,并发现了实现优化的各种方法。但有两个名字吸引了我的眼球。
- 分区修剪
- 谓词下推
他们说:
分区修剪:
分区修剪是一种限制数量的性能优化Spark在查询时读取的文件和分区的数量。之后对数据进行分区,查询与特定分区筛选器匹配标准通过允许Spark只读取子集来提高性能目录和文件的。
谓词下推:
Spark将尝试将数据筛选移动到与可以避免将不必要的数据加载到存储器中。镶木地板和ORC文件在不同的块中维护关于每列的各种统计信息aof数据(例如最小值和最大值(。读取这些文件的程序可以使用这些索引来确定某些块,甚至整个块文件,根本需要读取。这使得程序可以在处理过程中跳过大量数据。
通过阅读上述概念,它们似乎做了同样的事情,即应用满足查询中给定谓词的读语句(查询(。分区修剪和谓词下推是不同的概念,还是我用错误的方式看待它们?
区别在于谁应用优化,优化应用在哪里,以及可以应用到哪些数据源。
-
Spark在将分区修剪委托给处理文件格式的数据源之前,会自行应用分区修剪。它只适用于基于文件的格式,因为数据源还没有分区发现的概念。
-
谓词下推将行的过滤委托给负责处理特定格式的数据源(Spark对一种类型的数据源的术语(。谓词下推可用于基于文件和非基于文件的源,例如RDBMS和NoSQL数据库。
列修剪是一种从查询处理管道中删除不必要列的技术。这可以通过减少需要处理、存储在内存中和通过网络传输的数据量来提高查询的性能。数据库系统确定哪些列必须基于查询,并在执行查询之前删除未使用的列。
谓词下推和列修剪都是现代数据库系统中用来提高查询性能和有效利用可用资源的重要优化技术。