Lakehouse Data Share 跨账号数据共享入门指导

1. 方案概述

1.1 什么是Data Share

Data Share是Lakehouse提供的无复制数据共享功能,可在同一服务区域内实现跨账户或跨服务实例的数据授权与使用。与传统的数据复制或导入方案不同,Data Share不需要在企业间手动搭建数据同步链路,而是通过"授权"方式直接提供对源数据的只读访问,且实时更新。

1.2 核心优势

  • 无复制、低延迟:无需在企业间重复存储或定期同步,数据变更可以实时传播给消费方
  • 安全可控:数据仅以"只读"形式分享,且随时可通过权限管控移除共享对象
  • 易于扩展:通过View可以灵活过滤数据列或行,实现精细化的分享控制
  • 降低成本:消费方无需为被分享的数据存储付费,仅需使用自己的计算资源处理数据

1.3 适用场景

  • 实时共享场景:企业A将交易日志、用户行为数据等实时共享给企业B,企业B无需数据同步即可实时查询
  • 多方协作分析:多家合作方基于同一份实时数据进行分析,减少重复存储和传输成本
  • 数据提供商与消费者模式:数据提供方将部分数据开放给合作伙伴,消费方无需承担存储成本即可获得只读数据

2. 工作原理

Data Share的核心工作原理是:

  1. 数据保留在提供方:数据始终存储在数据提供方的账户中
  2. 共享元数据:共享元数据和访问权限给消费方
  3. 访问控制:消费方通过受控的只读访问权限查询数据
  4. 实时更新:提供方的数据更新后,消费方立即能访问到最新数据

数据共享流程

数据提供方保留完全的控制权,可以随时更新或移除共享数据。当源数据更新时,消费方可立即获取最新数据,无需额外的数据同步操作。

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界面方式

  1. 使用具备"实例管理员"角色的账号登录Lakehouse控制台
  2. 左侧导航选择"数据管理" → "数据分享",点击"+新增分享"
  3. 填写分享名称(如taxi_data_share),选择工作空间
  4. 点击"添加"选择要分享的数据对象(如taxi_zone_lookup表)
  5. 点击"接收实例"下的"添加",输入消费方提供的服务实例名称
  6. 点击"确定"完成创建

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界面方式

  1. 登录数据消费方的Lakehouse控制台
  2. 左侧导航选择"数据管理" → "数据分享"
  3. 切换到"分享给我"页签,即可看到所有接收到的分享

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界面方式

  1. 在"分享给我"页签中找到目标分享对象
  2. 点击"提取"按钮
  3. 在弹窗中选择"源schema",并指定在本地创建的schema名称
  4. 点击"确定"完成提取

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
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  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 SHARESDESC SHARE命令定期检查共享内容
  • 最小权限原则:只授予必要的权限(SELECT和READ METADATA)
  • 不要分享凭证:严禁共享管理员账号,使用Data Share进行安全的数据共享

7.2 性能与成本优化

  • 使用筛选视图:通过视图限制数据量,提高查询性能
  • 注意时区设置:确保提供方和消费方使用相同的时区设置,避免时间相关查询问题

8. 常见问题与故障排除

问题1:无法看到共享数据

可能原因

  • 权限配置错误,比如未授予read metadata权限
  • 实例名称输入有误

解决方法

  • 提供方使用show grants to share命令,检查share中共享的对象是否同时授予了SELECT 和 READ METADATA权限
  • 验证实例名称是否正确

问题2:无法查询共享数据

可能原因

  • 缺少SELECT权限

解决方法

GRANT SELECT ON TABLE <table_name> TO SHARE <share_name>;

9. 参考信息

联系我们
预约咨询
微信咨询
电话咨询