MaxCompute+DLF+OSS湖仓一体的湖查询和湖数据入仓实践

MaxCompute、DLF和OSS是阿里云提供的一体化解决方案,可以实现数据湖查询和湖数据入仓。通过配置DLF,将数据从OSS导入到MaxCompute中,并使用MaxCompute进行数据湖查询。该方案可以方便地进行数据分析和处理,并保证数据的可靠性和安全性。

前提条件

使用限制

  • 仅华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华南1(深圳)、中国香港、新加坡和德国(法兰克福)地域支持构建湖仓一体能力。

  • MaxCompute、OSS和DLF必须部署在同一地域。

操作步骤

步骤一:授予MaxCompute访问DLF和OSS的权限

操作MaxCompute项目的账号未经授权无法访问DLF和OSS服务,您需要执行授权操作。授权方式包含如下两种:

  • 一键授权:当创建MaxCompute项目的账号和部署DLF的账号相同时,推荐您直接单击授权DLF进行一键授权。

  • 自定义授权:无论创建MaxCompute项目的账号和部署DLF的账号是否相同,都可以使用自定义授权DLF方式。

步骤二:通过MaxCompute外部项目查询数据湖数据

说明

如果您的账号开启了租户级别Schema开关,执行下述代码前需要关闭三层模型,即设置以下参数set odps.namespace.schema=false;

基于已创建的MaxCompute项目、DLF元数据库和OSS存储空间,创建External Project,用于关联DLF和OSS,并映射至已创建的MaxCompute项目。后续可通过映射的MaxCompute项目对External Project进行数据分析操作。仅MaxCompute项目的所有者(Project Owner)或具备Admin、Super_Administrator角色的用户可以创建External Project。更多MaxCompute构建湖仓一体操作,请参见MaxCompute湖仓一体概述

  1. 在DataWorks控制台创建External Project。

    1. 登录DataWorks控制台,并选择地域。

    2. 在左侧导航栏选择更多 > 数据湖集成(湖仓一体)

    3. 数据湖集成(湖仓一体)页面,单击现在开始创建

    4. 新建数据湖集成页面,按照界面指引进行操作。参数说明及示例如下:

      参数

      描述

      示例

      创建数据仓库

      外部项目名称

      自定义外部项目名称。

      ext_project_oss

      MaxCompute项目

      所绑定的MaxCompute内部项目名称。

      parctice_test

      创建外部数据湖连接

      External Project描述

      可选。外部项目描述。

      异构数据平台类型

      选择阿里云DLF+OSS数据湖连接

      DLF所在区

      连接DLF所在的可用区,请根据地域进行选择。

      cn-hangzhou

      DLF Endpoint

      DLF的对内服务Endpoint,请根据地域进行选择。

      dlf-share.cn-hangzhou.aliyuncs.com

      DLF数据库名称

      连接DLF的目标数据库名称。您可以登录DLF控制台,在左侧导航栏元数据管理下拉列表下的元数据库页面获取。

      practice_db

      DLF RoleARN

      可选。RAM角色的ARN信息。采用自定义授权方式时,需要配置该参数。您可以登录RAM访问控制台,在左侧导航栏身份管理下拉列表下的角色页面获取。

    5. 单击创建,然后单击预览。若能预览DLF库中的表信息,则表示External Project创建成功。

  2. 在DataWorks临时查询页面,查看External Project下的表。

    • 命令示例:

      show tables in ext_project_oss;
    • 返回结果:

      ALIYUN$***@aliyun.com:nation_orcnation_orc
      ALIYUN$***@aliyun.com:partsupp_orcpartsupp_orc
      ALIYUN$***@aliyun.com:supplier_orcsupplier_orc
  3. 在DataWorks临时查询页面,查询External Project中的表数据。

    • 命令示例:

      SELECT
              ps_partkey,
              sum(ps_supplycost * ps_availqty) as value
      FROM
              ext_project_oss.partsupp_orcpartsupp_orc,
              ext_project_oss.supplier_orcsupplier_orc,
              ext_project_oss.nation_orcnation_orc
      WHERE
              ps_suppkey = s_suppkey
              and s_nationkey = n_nationkey
              and RTRIM(n_name) = 'EGYPT'
      GROUP BY
              ps_partkey HAVING
                      sum(ps_supplycost * ps_availqty) > (
                              SELECT
                                      sum(ps_supplycost * ps_availqty) * 0.000001
                              FROM
                                      ext_project_oss.partsupp_orcpartsupp_orc,
                                      ext_project_oss.supplier_orcsupplier_orc,
                                      ext_project_oss.nation_orcnation_orc
                              WHERE
                                      ps_suppkey = s_suppkey
                                      and s_nationkey = n_nationkey
                                      and RTRIM(n_name) = 'EGYPT'
                      )
      ORDER BY
              value desc;
    • 部分返回结果如下:

      ps_partkey	value
      465863	 19882392.75
      1319068	 19234404.98
      1001261	 18184602.42
      441166	 18072201.77
      1609960	 18035338.6
      1082959	 17756303.25
      140601	 17537986.68
      316323	 17521596.97
      971926	 17462615.06
      1472570	 17397733.88
      987594	 17163087.65
      ...      ...

步骤三:将外部项目数据导入内部表

  • 如果需要创建与外部数据源中表结构相同的表,可以使用CREATE TABLE...LIKE命令复制外部数据源中的表结构,详情请参见表操作。命令示例如下。

    -- 创建表
    CREATE TABLE from_exe_tbl LIKE ext_project_oss.partsupp_orcpartsupp_orc;
    -- 此时from_exe_tbl的表结构与 ext_project_oss.partsupp_orcpartsupp_orc 完全相同。
    -- 除生命周期属性外,列名、列注释以及表注释等均相同。
    -- 但 ext_project_oss.partsupp_orcpartsupp_orc 中的数据不会被复制到from_exe_tbl表中。
    
    -- 查询表
    SELECT * FROM from_exe_tbl;
    -- 查看表结构
    DESC from_exe_tbl;
  • 如果需要基于外部数据源中的表创建新表,并复制数据,但不复制分区属性,可以使用CREATE TABLE...AS命令复制外部数据源中表结构及数据,详情请参见表操作。命令示例如下。

    -- 创建表
    CREATE TABLE from_exe_tb2 AS SELECT * FROM ext_project_oss.partsupp_orcpartsupp_orc;
    -- 此时from_exe_tb2的表结构与 ext_project_oss.partsupp_orcpartsupp_orc 完全相同。
    -- 除生命周期属性外,列名、列注释以及表注释等均相同。
    -- ext_project_oss.partsupp_orcpartsupp_orc 中的数据也会被复制到from_exe_tb2表中。
    
    -- 查询表
    SELECT * FROM from_exe_tb2;
    -- 查看表结构
    DESC from_exe_tb2;