DLA支持MaxCompute(ODPS)数据源
1. 概述
支持功能包括:
- MaxCompute(ODPS)的数据查询,目前复杂数据类型以字符串形式返回;
- 一条命令同步对应project下的所有表。
不支持数据回流ODPS。
其他说明:
- 基于MaxCompute tunnel拉取数据;
通过在查询中指定WHERE <分区列> = <分区key>的形式进行分区过滤(裁剪),避免全表扫描数据,目前支持如下一些形式进行分区过滤(裁剪):
- WHERE <分区列> = <分区key>
- WHERE <分区列> = <分区key1> OR <分区列> = <分区key2> ...
- WHERE <分区列> IN (<分区key1>, <分区key2>, ...)
- 如果是多级分区,必须写明所有级别的分区过滤条件,并匹配,如: WHERE <一级分区列> = <一级分区key> AND <二级分区列> = <二级分区key> ...
- 不提供分区过滤,或者分区过滤条件不匹配实际分区的,会全表扫描数据;
- MaxCompute默认对project的tunnel访问有总体并发quota控制,DLA默认对单次查询控制tunnel并发1000。
2. 步骤
2.1 DLA中创建对应ODPS project的schema
CREATE SCHEMA <schema_name> WITH DBPROPERTIES (
catalog = 'odps',
location = 'http://dt.<region>.maxcompute.aliyun-inc.com',
endpoint = 'http://service.cn.maxcompute.aliyun-inc.com/api',
project = '<odps_project_name>',
USER = '<access_key>',
PASSWORD = '<access_secret>'
)
其中:
- schema_name为DLA中的定义的schema名;
location为对应ODPS中的tunnel endpoint;
- 各个region见文档:https://help.aliyun.com/document_detail/34951.html,注意,必须和DLA服务在同一个region;
- 使用“经典网络”的tunnel endpoint,特点是xxx.aliyun-inc.com,而不是xxx.aliyun.com;
endpoint为对应ODPS中的endpoint;
- 各个region见文档:https://help.aliyun.com/document_detail/34951.html,注意,必须和DLA服务在同一个region;
- 使用“经典网络”的endpoint,特点是xxx.aliyun-inc.com,而不是xxx.aliyun.com;
- odps_project_name为目标ODPS的项目名;
- access_key为访问ODPS的云账号access key;
- access_secret为访问ODPS的云账号access secret。
2.2 同步ODPS project下的表信息
msck repair database <schema_name>
执行上述命令,同步<schema_name>对应的ODPS project下的所有表,EXTERNAL TABLE(外表)不会被同步(注意:ODPS project下的表是分区表时,分区列会被作为普通列创建在DLA中的表列定义中,按顺序排在最后)。
仅仅需要上述两个步骤,就可以在DLA中:
- 对ODPS表进行查询;
- 使用INSERT from SELECT将ODPS数据回流到其他数据源。
到目前(2019年6月)为止,DLA支持的云上数据源情况如下:
3. 建表操作
除了上述2中的MSCK REPAIR DATABASE的全量元数据表同步机制之外,也可以单表进行建表操作,避免映射ODPS project下的全部表。
3.1 非分区表
ODPS中project下的非分区表对应的CREATE TABLE语句:
CREATE TABLE IF NOT EXISTS bank_data
(
age BIGINT COMMENT '年龄',
job STRING COMMENT '工作类型',
marital STRING COMMENT '婚否',
education STRING COMMENT '教育程度',
default STRING COMMENT '是否有信用卡',
housing STRING COMMENT '房贷',
loan STRING COMMENT '贷款',
contact STRING COMMENT '联系途径',
month STRING COMMENT '月份',
day_of_week STRING COMMENT '星期几',
duration STRING COMMENT '持续时间',
campaign BIGINT COMMENT '本次活动联系的次数',
pdays DOUBLE COMMENT '与上一次联系的时间间隔',
previous DOUBLE COMMENT '之前与客户联系的次数',
poutcome STRING COMMENT '之前市场活动的结果',
emp_var_rate DOUBLE COMMENT '就业变化速率',
cons_price_idx DOUBLE COMMENT '消费者物价指数',
cons_conf_idx DOUBLE COMMENT '消费者信心指数',
euribor3m DOUBLE COMMENT '欧元存款利率',
nr_employed DOUBLE COMMENT '职工人数',
y BIGINT COMMENT '是否有定期存款'
);
则在DLA中,用上述2.1中的步骤创建的schema下,创建对应project下的表(仅仅是多了一个EXTERNAL关键字,注意:表名和列名必须相同,如果遇到关键字,请用``引起来,比如下面的default列):
CREATE EXTERNAL TABLE IF NOT EXISTS bank_data
(
age BIGINT COMMENT '年龄',
job STRING COMMENT '工作类型',
marital STRING COMMENT '婚否',
education STRING COMMENT '教育程度',
`default` STRING COMMENT '是否有信用卡',
housing STRING COMMENT '房贷',
loan STRING COMMENT '贷款',
contact STRING COMMENT '联系途径',
month STRING COMMENT '月份',
day_of_week STRING COMMENT '星期几',
duration STRING COMMENT '持续时间',
campaign BIGINT COMMENT '本次活动联系的次数',
pdays DOUBLE COMMENT '与上一次联系的时间间隔',
previous DOUBLE COMMENT '之前与客户联系的次数',
poutcome STRING COMMENT '之前市场活动的结果',
emp_var_rate DOUBLE COMMENT '就业变化速率',
cons_price_idx DOUBLE COMMENT '消费者物价指数',
cons_conf_idx DOUBLE COMMENT '消费者信心指数',
euribor3m DOUBLE COMMENT '欧元存款利率',
nr_employed DOUBLE COMMENT '职工人数',
y BIGINT COMMENT '是否有定期存款'
);
3.2 分区表
ODPS project下的表是分区表时,分区列会被作为普通列创建在DLA中的表列定义中,按顺序排在最后。例如,ODPS project下的分区表对应的CREATE TABLE语句:
CREATE TABLE IF NOT EXISTS part_datatype_test_complex (
int_test int,
bigint_test bigint,
double_test double,
string_test string,
datetime_test datetime,
boolean_test boolean,
array_test array<INT>,
map_test map<string, string>,
struct_test_1 struct<x:INT, y:INT>,
struct_test_2 struct<x:string, y:string>
)
partitioned by (pt bigint, region string);
到目前(2019年6月)为止,还不支持在DLA中直接用复杂类型映射ODPS的复杂类型,可以先把复杂类型用字符串类型映射,对应的CREATE TABLE语句为:
CREATE EXTERNAL TABLE IF NOT EXISTS part_datatype_test_complex (
int_test int,
bigint_test bigint,
double_test double,
string_test string,
datetime_test datetime,
boolean_test boolean,
array_test string,
map_test string,
struct_test_1 string,
struct_test_2 string,
pt bigint,
region string
)