
# Spark SQL开发规范
#### Spark SQL嵌套语法建议
Spark的"spark.sql.codegen.wholeStage"参数默认为"true"，当SQL嵌套逻辑过多时，Spark Driver在编译解析SQL生成代码过程中的压力就会过大，发生OOM报错。因此，建议如下：
- 整改Spark SQL命令。
- 修改"spark.sql.codegen.wholeStage"参数为"false"，使得Spark Driver侧不生成完整的Java代码。
 
#### Spark SQL中having使用建议
正常情况下**having** 位于**group by** 后用于筛选分组后的各组数据，Spark 2.3未规范校验**having** ，执行正常；Spark 2.4开始严格校验，如果在没有**group by** 的情况下使用**having**，会导致编译报错，版本间存在差异。因此，建议如下：
- 整改SQL命令，用**where** 代替**having**规范使用。
  
- Spark 2.4版本，设置参数"spark.sql.legacy.parser.havingWithoutGroupByAsWhere"的值为"true"。
 
