Spark SQL是Apache Spark中的最重要的功能之一。在 SQL的使用上,Spark SQL和其它适用于大规模离线数据的SQL引擎 (例如Presto/Apache Hive) 是相似的。除了SQL之外,Apache Spark还提供了更为灵活的DataFrame API。
Spark SQL和Spark DataFrame API有着不同的使用场景。
Spark DataFrame API的表达能力比Spark SQL更强,对于有良好编程基础和代码抽象能力的工程师来说,使用DataFrame来解决复杂的数据处理问题更加便捷;
Spark SQL的语法几乎和Apache Hive的SQL语法几乎一致。绝大部分数据处理需求,使用Spark SQL就能够满足。使用DataFrame API,我们需要创建一个Scala工程,编译代码并打包,最终通过spark-submit提交到集群;而Spark SQL无需构建生成中间产物,就可以通过JDBC等方式提交到集群。
我们需要定制Spark SQL
但是使用Spark SQL,我们总会遇到各种极端情况需要处理,比如:
“我有一个200列的表,我想把其中的两列排除掉,把剩下的198列保存到一个新的表里面。”
如果使用Spark DataFrame API,这个问题可以这样解决:
但是用SQL,把198个列名直接放在SQL语句里面,不具备可读性,且无法应对字段增加的情况:
select col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, …
对于这个问题,Spark SQL有一种兼容HiveQL的