一、Spark SQL的愿景
主要有以下三点:
- Write less code
- Read less data
- Let the optimizer do the hard work
二、Write less code
Unified interface to reading/writing data in a variety of formats
对不同的数据类型使用统一的接口来读写
ETL using custom data source
Common operations can be expressed concisely as calls to the DataFrame API.
- Selecting required columns
- Joining different data sources
- Aggregationg(count, sum, average,etc)
- filtering
常用的数据操作可以使用DataFrame的API非常简洁的完成。
Schema inference (Schema推导)
比如半结构化的数据,如json可以自动推导字段Schema merging
比如int 类型字段和double类型字段合并,可以自动兼容的使用double类型。Partition Discovery(自动的分区探测)
三、Read less data
- Converting to more efficient formats, Using columnar formats(i.e. parquet)
- Using partitioning
- Skipping data using statistics
- Pushing predicates into storage systems(i.e. JDBC)
提升大数据处理速度最有效的方法就是忽略无关的数据。
1.使用列式存储(columnar formats),比如Parquet、ORC、RCFile
2.使用分区裁剪(partitioning pruning),比如按天分区,按小时分区等
3.利用数据文件中附带的统计信息进行剪枝:例如每段数据都带有最大值、最小值和NULL值等统计信息,当某一数据段肯定不包含查询条件的目标数据时,可以直接跳过这段数据。(例如字段age某段最大值为20,但查询条件是>50岁的人时,显然可以直接跳过这段)
4.将查询源中的各种信息下推至数据源处,从而充分利用数据源自身的优化能力来完成剪枝、过滤条件下推等优化。
什么是列式存储?列式存储相比于行式存储的优缺点?– 博文待写
四、Let the optimizer do the hard work
Catalyst优化器对SQL语句进行优化,从而得到更有效的执行方案。即使我们在写SQL的时候没有考虑这些优化的细节,Catalyst也可以帮我们做到不错的优化结果。