Lakehouse Data Share 跨账号数据共享入门指导
1. 方案概述
1.1 什么是Data Share
Data Share是Lakehouse提供的无复制数据共享功能,可在同一服务区域内实现跨账户或跨服务实例的数据授权与使用。与传统的数据复制或导入方案不同,Data Share不需要在企业间手动搭建数据同步链路,而是通过"授权"方式直接提供对源数据的只读访问,且实时更新。
1.2 核心优势
- 无复制、低延迟:无需在企业间重复存储或定期同步,数据变更可以实时传播给消费方
- 安全可控:数据仅以"只读"形式分享,且随时可通过权限管控移除共享对象
- 易于扩展:通过View可以灵活过滤数据列或行,实现精细化的分享控制
- 降低成本:消费方无需为被分享的数据存储付费,仅需使用自己的计算资源处理数据
1.3 适用场景
- 实时共享场景:企业A将交易日志、用户行为数据等实时共享给企业B,企业B无需数据同步即可实时查询
- 多方协作分析:多家合作方基于同一份实时数据进行分析,减少重复存储和传输成本
- 数据提供商与消费者模式:数据提供方将部分数据开放给合作伙伴,消费方无需承担存储成本即可获得只读数据
2. 工作原理
Data Share的核心工作原理是:
- 数据保留在提供方:数据始终存储在数据提供方的账户中
- 共享元数据:共享元数据和访问权限给消费方
- 访问控制:消费方通过受控的只读访问权限查询数据
- 实时更新:提供方的数据更新后,消费方立即能访问到最新数据
数据共享流程:

数据提供方保留完全的控制权,可以随时更新或移除共享数据。当源数据更新时,消费方可立即获取最新数据,无需额外的数据同步操作。
3. 使用前提条件
- 数据提供方和数据消费方均需有Lakehouse实例
- 双方需在同一服务区域内
- 数据提供方需具备"实例管理员"(instance_admin)角色权限
- 数据共享操作需要消费方提供其服务实例名称
4. 实操指南:数据提供方
4.1 创建分享对象
数据提供方(数据所有者)需要执行以下步骤创建并配置分享对象:
4.1.1 SQL方式
-- 步骤1:创建Share对象
CREATE SHARE taxi_data_share;
-- 步骤2:将表添加到Share对象中
GRANT SELECT, READ METADATA ON TABLE demo_schema.taxi_zone_lookup TO SHARE taxi_data_share;
-- 步骤3:指定接收实例
ALTER SHARE taxi_data_share ADD INSTANCE target_instance_name;
4.1.2 Web界面方式
- 使用具备"实例管理员"角色的账号登录Lakehouse控制台
- 左侧导航选择"数据管理" → "数据分享",点击"+新增分享"
- 填写分享名称(如taxi_data_share),选择工作空间
- 点击"添加"选择要分享的数据对象(如taxi_zone_lookup表)
- 点击"接收实例"下的"添加",输入消费方提供的服务实例名称
- 点击"确定"完成创建

4.1.3 针对部分数据创建视图再共享
如果只需要共享表的部分数据,可以先创建视图,然后共享视图:
-- 创建专用schema用于管理分享视图
CREATE SCHEMA share_views;
-- 创建筛选数据的视图
CREATE VIEW share_views.filtered_taxi_zones AS
SELECT * FROM demo_schema.taxi_zone_lookup
WHERE borough = 'Manhattan';
-- 共享视图
GRANT SELECT, READ METADATA ON VIEW share_views.filtered_taxi_zones TO SHARE taxi_data_share;
4.2 验证分享配置
创建并配置完成后,可以通过以下命令验证分享是否正确配置:
-- 查看所有Share对象
SHOW SHARES;
-- 查看特定Share的详细信息
DESC SHARE taxi_data_share;
示例输出:
share_name provider provider_instance provider_workspace scope to_instance kind
---------------------------------------------------------------------------------------------
taxi_data_share provider_instance_name source_instance_name source_workspace PRIVATE target_instance_name OUTBOUND
5. 实操指南:数据消费方
数据消费方(接收方)需要执行以下步骤来访问共享数据:
5.1 查看可用共享
5.1.1 SQL方式
-- 查看所有可见的Share
SHOW SHARES;
示例输出(从消费方实例查看):
share_name provider provider_instance provider_workspace scope to_instance kind
---------------------------------------------------------------------------------
taxi_data_share provider_instance_name source_instance_name source_workspace PRIVATE INBOUND
-- 查看Share对象中包含的数据对象
DESC SHARE source_instance_name.taxi_data_share;
5.1.2 Web界面方式
- 登录数据消费方的Lakehouse控制台
- 左侧导航选择"数据管理" → "数据分享"
- 切换到"分享给我"页签,即可看到所有接收到的分享

5.2 创建本地Schema关联共享数据
5.2.1 SQL方式
-- 创建本地Schema映射到共享数据
CREATE SCHEMA shared_taxi_data FROM SHARE source_instance_name.taxi_data_share.source_schema;
其中:
shared_taxi_data
:在本地创建的schema名称(可自定义)
source_instance_name
:提供方的实例名称
taxi_data_share
:分享对象名称
source_schema
:提供方的源schema名称
5.2.2 Web界面方式
- 在"分享给我"页签中找到目标分享对象
- 点击"提取"按钮
- 在弹窗中选择"源schema",并指定在本地创建的schema名称
- 点击"确定"完成提取

5.3 使用共享数据
创建schema后,共享数据将以只读方式出现在本地schema中:
-- 查询共享表数据
SELECT * FROM shared_taxi_data.taxi_zone_lookup LIMIT 5;
-- 创建分析视图
CREATE VIEW my_analysis AS
SELECT borough, COUNT(*) as zone_count
FROM shared_taxi_data.taxi_zone_lookup
GROUP BY borough;
-- 与本地数据关联分析
SELECT t.*, z.borough, z.zone
FROM my_local_table t
JOIN shared_taxi_data.taxi_zone_lookup z ON t.location_id = z.locationid;
6. 完整案例:跨账号共享出租车区域数据
6.1 背景场景
A公司运营纽约市出租车服务并维护taxi_zone_lookup
表,包含所有区域信息。B公司是一家分析公司,需要访问这些区域数据进行分析,但不需要复制数据。
6.2 实施步骤
6.2.1 查看源表数据
首先,A公司查看要共享的表结构:
DESC TABLE EXTENDED demo_schema.taxi_zone_lookup;
结果显示表结构如下:
column_name data_type comment
----------------------------------
locationid bigint PULocationID or DOLocationID
borough string
zone string
service_zone string
表中包含265行数据,记录了纽约市出租车区域信息。
6.2.2 创建分享对象
A公司创建分享对象并配置:
-- 创建Share对象
CREATE SHARE taxi_data_share;
-- 添加表到Share
GRANT SELECT, READ METADATA ON TABLE demo_schema.taxi_zone_lookup TO SHARE taxi_data_share;
-- 指定B公司的实例作为接收方
ALTER SHARE taxi_data_share ADD INSTANCE target_instance_name;
6.2.3 验证分享配置
A公司验证分享配置是否正确:
DESC SHARE taxi_data_share;
输出结果显示:
kind name shared_on
-------------------------------------------------------
WORKSPACE <WS> 2025-05-15 20:37:58.13
SCHEMA <WS>.demo_schema 2025-05-15 20:38:02.018
TABLE <WS>.demo_schema.taxi_zone_lookup 2025-05-15 20:38:02.018
输出结果包含新创建的分享:
share_name provider provider_instance provider_workspace scope to_instance kind
--------------------------------------------------------------------------------------
taxi_data_share provider_instance_name source_instance_name source_workspace PRIVATE target_instance_name OUTBOUND
6.2.4 B公司访问共享数据
B公司(实例target_instance_name)执行以下操作使用共享数据:
-- 查看可用分享
SHOW SHARES;
-- 查看分享内容
DESC SHARE source_instance_name.taxi_data_share;
-- 创建本地Schema
CREATE SCHEMA taxi_data FROM SHARE source_instance_name.taxi_data_share.demo_schema;
-- 查询数据
SELECT borough, COUNT(*) as zone_count
FROM taxi_data.taxi_zone_lookup
GROUP BY borough
ORDER BY zone_count DESC;
B公司可以查询结果并创建报表,无需复制数据。当A公司更新原表数据时,B公司会立即看到最新数据。
7. 最佳实践
7.1 安全性最佳实践
- 使用视图限制敏感数据:通过视图筛选行或列,确保只共享必要数据
- 定期审计共享对象:使用
SHOW SHARES
和DESC SHARE
命令定期检查共享内容
- 最小权限原则:只授予必要的权限(SELECT和READ METADATA)
- 不要分享凭证:严禁共享管理员账号,使用Data Share进行安全的数据共享
7.2 性能与成本优化
- 使用筛选视图:通过视图限制数据量,提高查询性能
- 注意时区设置:确保提供方和消费方使用相同的时区设置,避免时间相关查询问题
8. 常见问题与故障排除
问题1:无法看到共享数据
可能原因:
- 权限配置错误,比如未授予read metadata权限
- 实例名称输入有误
解决方法:
- 提供方使用show grants to share命令,检查share中共享的对象是否同时授予了SELECT 和 READ METADATA权限
- 验证实例名称是否正确
问题2:无法查询共享数据
可能原因:
解决方法:
GRANT SELECT ON TABLE <table_name> TO SHARE <share_name>;
9. 参考信息