基于DLF1.0 +OSS读取湖上CSV数据

本文介绍通过配置DLF,将数据从OSS抽取到DLF元数据中,并使用MaxComputeexternal schema进行数据湖联邦查询。该方案可以方便地进行数据分析和处理,并保证数据的可靠性和安全性。

前提条件

使用限制

  • 支持地域

    地域名称

    地域ID

    华东1(杭州)

    cn-hangzhou

    华东2(上海)

    cn-shanghai

    华北2(北京)

    cn-beijing

    华北3(张家口)

    cn-zhangjiakou

    华南1(深圳)

    cn-shenzhen

    中国香港

    cn-hongkong

    新加坡

    ap-southeast-1

    德国(法兰克福)

    eu-central-1

  • MaxCompute、OSSDLF必须部署在同一地域。

操作步骤

步骤一:授予MaxCompute访问DLFOSS的权限

操作MaxCompute项目的账号未经授权无法访问DLFOSS服务,授权方式包含如下两种:

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

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

步骤二:准备OSS数据

  1. 登录OSS控制台,创建Bucket,本示例中Bucket名为mc-lakehouse-dlf-oss。详情请参见创建存储空间

  2. 本文以分区表为例,在Bucket下新建总目录mc_dlf_oss_pt/,在该目录下新建四个子目录并上传文件,分别为:

步骤三:DLF1.0抽取OSS元数据

  1. 登录数据湖构建(DLF)控制台

  2. 在左侧导航栏,选择元数据 > 元数据管理。在当前元数据管理页面,单击数据库页签,在default数据目录下单击新建数据库。配置如下参数:

    参数

    是否必填

    说明

    所属数据目录

    必填

    示例中是default数据目录。

    数据库名称

    必填

    自定义数据库名称,以字母开头,1-128位,a-ZA-Z0-9_,例如db_dlf_oss

    数据库描述

    选填

    自定义描述。

    选择路径

    必填

    数据库存储位置,例如oss://mc-lakehouse-dlf-oss/mc_dlf_oss_pt/

  3. 在左侧导航栏,选择元数据 > 元数据抽取。在当前元数据抽取页面,单击新建抽取任务

    1. 设置抽取源,配置如下参数:

      参数

      是否必填

      说明

      抽取任务名称

      必填

      自定义抽取任务名称。

      OSS路径

      必填

      DLF会根据输入的OSS路径,自动创建表和分区。

      例如抽取文件oss://bucket-path/table-option/dt-option/data.csv时,输入选择路径oss://bucket-path/catalogue-path/,系统会以table-option作为表名,dt-option作为一个分区,抽取data.csv作为表的schema。

      注意表名所在的路径名需要字母开头,仅支持数字字母下划线组合。

      排除模式

      选填

      正则匹配需要排除的路径名。

      解析格式

      必填

      提供自动识别、json、CSV、parquet、orc、hudi、delta、avro等多种表格式。

    2. 设置目标信息,配置如下参数:

      参数

      是否必填

      说明

      所属数据目录

      必填

      选择目标信息所属数据目录。

      目标数据库

      必填

      选择已构建的数据库。

      目标数据表前缀

      选填

      目标数据表前缀,英文开头+英文大小写数字_,最多128位。

      抽取任务发现表字段更新时

      必填

      选择抽取任务发现表字段更新时的行为:

      • 仅新增列,不支持删除原有列。

      • 更新表结构,根据最新探测的表结构生成新的表结果。(选择该项后,元数据抽取结果会覆盖原有重名的表,可能造成原有表丢失或不可用。)

      • 忽略更新,不修改任何表。

      如何处理OSS中发现已删除对象

      必填

      两种处理方式:

      • 删除对应的元数据。

      • 忽略更新,不删除任何表。

    3. 设置抽取任务,配置如下参数:

      参数

      是否必填

      说明

      RAM 角色

      必填

      Data Lake Formation服务通过扮演该角色来访问用户资源,可选择系统默认AliyunDLFWorkFlowDefaultRole角色。

      执行策略

      选填

      作业的执行策略。可选择手动执行或调度执行。

      抽取策略

      必填

      • 快速抽取:抽取元数据时只扫描每个文件的部分数据,抽取作业消耗时间较短,抽取结果准确性低于全量抽取,可以在元数据编辑中调整元数据信息。

      • 全量抽取:抽取元数据时扫描全量数据文件,在数据规模比较大时,作业消耗时间长,抽取结果更准确。

    4. 单击保存并立即执行

  4. 抽取任务完成后,可在左侧导航栏元数据 > 元数据管理,单击进入数据库页签,点击数据库名db_dlf_oss,在表列表页签可查看到抽取的表mc_dlf_oss_pt

  5. 若添加新分区数据,需要重新执行抽取任务。

步骤四:创建DLF1.0+OSS外部数据源

  1. 登录MaxCompute控制台,在左上角选择地域。

  2. 在左侧导航栏,选择管理配置 > 外部数据源

  3. 外部数据源页面,单击创建外部数据源

  4. 新增外部数据源对话框,根据界面提示配置相关参数。参数说明如下:

    参数

    说明

    外部数据源类型

    选择DLF+OSS

    外部数据源名称

    可自定义命名。命名规则如下:

    • 以字母开头,且只能包含小写字母、下划线和数字。

    • 不能超过128个字符。

    例如mc_dlf_oss_pt

    外部数据源描述

    根据需要填写。

    地域

    默认为当前地域。

    DLF Endpoint

    默认为当前地域的DLF Endpoint。

    OSS Endpoint

    默认为当前地域的OSS Endpoint。

    RoleARN

    RAM角色的ARN信息。此角色需要包含能够同时访问DLFOSS服务的权限。

    您可以登录RAM访问控制台,在左侧导航栏选择身份管理>角色,单击对应的RAM角色名称,即可在基本信息区域获取ARN信息。

    示例:acs:ram::124****:role/aliyunodpsdefaultrole

    外部数据源补充属性

    特殊声明的外部数据源补充属性。指定后,使用此外部数据源的任务可以按照参数定义的行为访问源系统。

    说明

    支持的具体参数请关注后续官网文档更新说明,具体参数将随产品能力演进逐步放开。

  5. 单击确认,完成外部数据源的创建。

  6. 外部数据源页面,单击数据源操作列的详情可查看数据源详细信息。

步骤五:创建外部schema

SET odps.namespace.schema=true;

CREATE EXTERNAL SCHEMA IF NOT EXISTS <external_schema>
WITH mc_dlf_oss_pt
ON '<dlf_data_catalogue>.dlf_database';

参数说明如下:

  • external_schema:自定义外部Schema名称。例如es_mc_dlf_oss_pt

  • external_data_source:上述已创建的外部数据源名称,外部Schema归属的项目必须与外部数据源处于同一地域。例如mc_dlf_oss_pt

  • dlf_data_catalogueDLF数据目录ID。数据目录创建方法请参见新建数据目录。例如122****

  • dlf_database:DLF中指定数据目录下的数据库名称。详情请参见数据库表及函数。例如db_dlf_oss

步骤六:使用SQL访问OSS数据

  1. 登录MaxCompute客户端,查询external schema内的表。

SET odps.namespace.schema=true;
SHOW tables IN es_mc_dlf_oss_pt;

-- 返回结果:
ALIYUN$xxx:mc_dlf_oss_pt

OK
  1. 查询external schema内的mc_dlf_oss表明细。

SET odps.namespace.schema=true;
SELECT * FROM <project_name>.es_mc_dlf_oss_pt.mc_dlf_oss_pt WHERE direction='NE';

-- 返回结果如下:
+------------+------------+------------+------------+------------+------------+----------------+------------+
| _c0        | _c1        | _c2        | _c3        | _c4        | _c5        | _c6            | direction  | 
+------------+------------+------------+------------+------------+------------+----------------+------------+
| 1          | 2          | 13         | 1          | 46.81006   | -92.08174  | 9/14/2014 0:00 | NE         | 
| 1          | 3          | 48         | 1          | 46.81006   | -92.08174  | 9/14/2014 0:00 | NE         | 
| 1          | 9          | 4          | 1          | 46.81006   | -92.08174  | 9/15/2014 0:00 | NE         | 
+------------+------------+------------+------------+------------+------------+----------------+------------+

步骤七:将联邦外表的数据复制入数仓

  1. 将联邦外表的数据复制到数仓中。

    CREATE TABLE vehicle_copy AS 
    SELECT * FROM <project_name>.es_mc_dlf_oss_pt.mc_dlf_oss_pt 
    WHERE direction='NE';
  2. 查询数仓中已复制的表数据。

    SELECT * FROM vehicle_copy;
    
    -- 返回结果。
    +------------+------------+------------+------------+------------+------------+----------------+------------+
    | _c0        | _c1        | _c2        | _c3        | _c4        | _c5        | _c6            | direction  | 
    +------------+------------+------------+------------+------------+------------+----------------+------------+
    | 1          | 2          | 13         | 1          | 46.81006   | -92.08174  | 9/14/2014 0:00 | NE         | 
    | 1          | 3          | 48         | 1          | 46.81006   | -92.08174  | 9/14/2014 0:00 | NE         | 
    | 1          | 9          | 4          | 1          | 46.81006   | -92.08174  | 9/15/2014 0:00 | NE         | 
    +------------+------------+------------+------------+------------+------------+----------------+------------+