对于使用关系型数据库或分布式数据库的用户可能更容易和更自然地使用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版本,都可以使用createOrRepl