跨源复杂数据的SQL查询优化
场景描述
出于管理和信息收集的需要,企业内部会存储海量数据,包括数目众多的各种数据库、数据仓库等,此时会面临以下困境:数据源种类繁多,数据集结构化混合,相关数据存放分散等,这就导致了跨源复杂查询因传输效率低,耗时长。
当前开源Spark在跨源查询时,只能对简单的filter进行下推,因此造成大量不必要的数据传输,影响SQL引擎性能。针对下推能力进行增强,当前对aggregate、复杂projection、复杂predicate均可以下推到数据源,尽量减少不必要数据的传输,提升查询性能。
目前仅支持JDBC数据源的查询下推,支持的下推模块有aggregate、projection、predicate、aggregate over inner join、aggregate over union all等。为应对不同应用场景的特殊需求,对所有下推模块设计开关功能,用户可以自行配置是否应用上述查询下推的增强。
模块 |
增强前 |
增强后 |
---|---|---|
aggregate |
不支持aggregate下推 |
|
projection |
仅支持简单projection下推,例如:select a, b from table |
|
predicate |
仅支持运算符左边为列名右边为值的简单filter,例如 select * from table where a>0 or b in (“aaa”, “bbb”) |
|
aggregate over inner join |
需要将两个表中相关的数据全部加载到Spark,先进行join操作,再进行aggregate操作 |
支持以下几种:
不支持的情形有:
|
aggregate over union all |
需要将两个表中相关的数据全部加载到Spark,先进行union操作,再进行aggregate操作 |
支持情况: 支持的聚合函数为:sum, avg, max, min,count 不支持的情况:
|
注意事项
- 外部数据源是Hive的场景,通过Spark建的外表无法进行查询。
- 数据源只支持mysql和mppdb。