如何将Snowflake表设置为Databricks Hive元存储的外部表
结论
该操作完全可行,你可以在Databricks的Hive元存储/Unity Catalog中创建指向Snowflake表的外部表,无需将Snowflake数据导入Databricks存储层,创建后即可直接用Spark SQL和Delta表做关联查询、合并等操作,和你之前创建ADLS Gen2上的Delta外部表逻辑一致。
操作步骤
方式1:SQL语句直接创建(和Delta外部表语法对齐)
直接使用CREATE TABLE语句,将USING后的数据源类型改为snowflake,填入对应的Snowflake连接参数即可:
CREATE TABLE IF NOT EXISTS <Databricks侧库名>.<自定义表名> USING snowflake OPTIONS ( sfURL '<Snowflake账户标识>.snowflakecomputing.com', sfUser '<Snowflake用户名>', sfPassword '<Snowflake密码>', sfRole '<Snowflake角色>', sfWarehouse '<Snowflake计算仓库名>', sfDatabase '<Snowflake侧库名>', sfSchema '<Snowflake侧Schema名>', dbtable '<Snowflake侧表名>' );
注意:不要硬编码密码等敏感信息,推荐使用Databricks Secrets存储敏感配置,密码字段替换为
sfPassword secret("<密钥作用域名称>", "<Snowflake密码对应的密钥名>")即可。
方式2:通过Spark API创建
如果你习惯用Python代码实现,也可以先读取Snowflake表生成DataFrame,再注册为持久化的元数据表:
sfOptions = { "sfURL" : "<Snowflake账户标识>.snowflakecomputing.com", "sfUser" : "<Snowflake用户名>", "sfPassword" : "<Snowflake密码>", "sfDatabase" : "<Snowflake侧库名>", "sfRole": "<Snowflake角色>", "sfWarehouse" : "<Snowflake计算仓库名>", "dbtable": "<Snowflake侧Schema名>.<Snowflake侧表名>" } # 读取Snowflake表后直接注册为元数据表,数据不会落地到Databricks存储 spark.read.format("net.snowflake.spark.snowflake")\ .option("column_mapping","name")\ .options(**sfOptions) \ .load() \ .write.mode("ignore") \ # 表不存在时才创建,避免覆盖 .saveAsTable("<Databricks侧库名>.<自定义表名>")
使用示例
创建完成后,你可以直接像查询普通Delta表一样使用该外部表,和Delta表合并的参考示例如下:
-- 示例:Snowflake外部表与Delta表关联查询 SELECT a.*, b.delta_table_column FROM <Databricks侧库名>.<Snowflake外部表名> a INNER JOIN <Delta表名> b ON a.common_id = b.common_id
补充说明:该外部表本质是指向Snowflake的映射,查询时会自动将计算逻辑下推到Snowflake执行,不会占用Databricks侧的存储资源,查询性能和直接调用Spark连接器读取Snowflake表一致。
内容的提问来源于stack exchange,提问作者Cristian Ispan
相关产品推荐
相关产品推荐

