如何用Spark SQL实现多Catalog联邦查询

目前对多Catalog的支持俨然成为计算引擎的标配,因为在OLAP场景,跨数据源的联合查询是一大刚需。但是,传统的计算引擎如Hive、Spark2对多Catalog支持能力很弱,也许是受Flink、Presto(Trino)的步步紧逼,Hive3也开始支持多Catalog,但是仅限于存储层面和API层面,还没有推进到SQL层。Spark相比Hive要进展好得多,在多Catalog的实现方式上甚至成为Flink实现多Catalog的借鉴对象。本文来研究下Spark3多Catalog的用法。

首先我们从简单的Spark查询开始。

SparkConf sparkConf = new SparkConf()
.set("hive.metastore.uris",hiveMetastoreURI)
.set("spark.sql.warehouse.dir",warehousePath)
.setMaster("local[*]") // spark-submit should remove this
.setAppName(getClass().getSimpleName());

SparkSession sparkSession = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate();
sparkSession.sql("show databases").show();

如上示例,Spark3 仅通过配置hive.metastore.uris 地址,我们就可以访问Hive Metastore的元数据,进行SQL查询等操作,最新Spark3 基于Hive Metastore Client 2.3.9版本开发,能够兼容HMS 2.x和3.x,但是使用有个限制:无法访问HMS3.x 非默认Catalog中的元数据。(此处所说的Catalog是HMS 存储模型中的Catalog,非本文说的Spark Catlalog)。

如果要访问HMS3.x 非默认Catalog中的元数据,就需要指定HMS的高版本jars路径,Spark3 提供了加载外部jars的方式,这里以Hive 3.1.2为例:

SparkConf sparkConf = new SparkConf()
.set("hive.metastore.uris",hiveMetastoreURI)
.set("spark.sql.warehouse.dir",warehousePath)
.set("spark.sql.hive.metastore.version", "3.1.2")
.set("metastore.catalog.default", defaultCatalogName)
.set("spark.sql.hive.metastore.jars", String.format("%s/lib/*", hiveHome))
.setMaster("local[*]") // spark-submit should remove this
.setAppName(getClass().getSimpleName());

SparkSession sparkSession = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate();
sparkSession.sql("show databases").show();

示例中通过metastore.catalog.default指定了当前要访问的HMS catalog,此时Spark就能够获取到defaultCatalogName指定的catalog 下的HMS元数据。

除了可以配置上述HMS地址参数外,还可以配置更多参数,而参数的名称和值,跟使用Hive、Hadoop参数一样的标准参数。以Spark 操作Ic

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值