对于使用关系型数据库或分布式数据库的用户可能更容易和更自然地使用SQL,比如Hive。在Spark SQL编写SQL命令时,它们将被转换为DataFrame上的操作。通过连接到Spark的Thrift服务器,它们可以通过标准的JDBC或ODBC协议从应用服务器连接到Spark。Spark支持两种SQL方言:SQL和HQL。Spark社区推荐的是HQL,因为HQL具有更丰富的功能。要使用HQL,需要使用Hive支持的Spark发行版。除了带来更强大的SQL解析器之外,Hive支持可让用户访问现有的Hive表,并使用现有的社区构建的Hive UDF。通过在构建SparkSession时在Builder对象上调用enableHiveSupport(),可以在Spark上启动Hive功能。
val spark = SparkSession.builder().enableHiveSupport().getOrCreate()
1、表目录和Hive metadata
大多数表SQL操作都是以名称引用的。当使用Spark SQL来执行SQL查询时,可以通过将DataFrame注册为表来引用DataFrame。当这样做时,Spark将表定义存储在表目录中。对于不支持Hive的Spark,表目录实现为简单的内存映射,这意味着表信息存在于驱动程序的内存中,并且随着Spark会话的消失而消失。另外,Hive支持的SparkSession使用Hive metastore来实现表目录。Hive metastore是一个持久性数据库,所以即使会话消失了,DataFrame定义仍然可用。
(1)注册临时表
不管是不是Hive支持的Spark版本,都可以使用createOrReplaceTempView方法来注册一个临时表
postsDf.createOrReplaceTempView("posts_temp")
现在可以使用名为posts_temp的DataFrame来执行SQL,来查询postsDf DataFrame
(2)注册永久表
要将DataFrame注册为永久表,可以write方法
postsDf.write.saveAsTable("posts")
votesDf.write.saveAsTable("votes")
(3)使用Spark表目录
Spark提供了管理表目录的功能。它被实现为Catalog类,可通过SparkSession的catalog来访问,比如如果需要查看当前注册的表,可以使用下面这行代码:
spark.catalog.listTables().show()
还可以使用Catalog对象来检查待定表的列
spark.catalog.listColumns("votes").show()
(4)配置远程Hive metastore
可以使用远程Hive metastore数据库配置Spark,这可以是现有Hive安装的metastore数据库或者是Spark专用的新数据库。这个配置可以通过适当的配置参数将Hive配置文件hive-site.xml放在Spark的conf目录中完成。这将覆盖spark.sql.warehouse.dir参数。
(注:Hive on Spark和SparkSQL都是在Spark在Spark上实现的解决方案,可以说都是一个翻译层,将一个SQL翻译成分布式可执行的Spark程序)
2、执行SQL查询
将DataFrame注册成表之后,就可以使用SQL语句对其中的数据进行查询,比如可以使用SparkSession中的sql函数实现
val resultDf = sql("select * from posts")
也可以使用Spark SQL Shell
spark-sql> select substring(title, 0, 70) from posts where postTypeId = 1 order by creationDate desc limit 3;
$ spark-sql -e "select substring(title, 0, 70) from posts where postTypeId = 1 order by creationDate desc limit 3"
3、通过Thrift服务器连接到Spark SQL
除了可以在程序或者是SQL shell上执行SQL查询外,Spark还可以通过成为Thrift的JDBC(和ODBC)服务器远程运行SQL命令。JDBC(和ODBC)是访问关系数据库的标准方式,这意味着Spark可以与任何跟关系型数据库相关的应用程序交互。Thrift是一个特殊的Spark应用程序,能够接收多个JDBC(和ODBC)的连接,并在Spark SQL会话中执行查询。
本文介绍了如何在Spark中使用SQL,特别是Spark SQL。通过创建DataFrame并注册为临时或永久表,可以使用SQL查询数据。Spark支持SQL和HQL,推荐使用HQL,因为它提供更丰富的功能。SparkSession的catalog接口用于管理表目录,可以配置连接远程Hive metastore。此外,Spark还提供Thrift服务器,允许通过JDBC/ODBC远程执行SQL查询。
1595

被折叠的 条评论
为什么被折叠?



