分析型数据库的查询模式适合在海量数据中进行分析计算后输出适量数据,若需要输出的数据量达到一定规模,分析型数据库提供数据导出(DUMP)的方式。注意目前DUMP方式中不能使用针对非分区列的聚合函数。
通过类DML语句导出到MaxCompute
前提须知
分析型数据库通过一个固定云账号进行数据导出到MaxCompute(与数据从MaxCompute导入到AnalyticDB情况类似)。各个专有云的导出账号名参照专有云的相关配置文档,一般为test1000000009@aliyun.com(与导入账号一致),公共云导出账号为garuda_data@aliyun.com。
需要给导入账号授予目标MaxCompute项目的createInstance权限,以及目标表的describe、select、alter、update、drop权限。
授权命令:
- --注意正确输入需要授权的表命名、project和正确的云账号
- USE prj_name;--表所属ODPS project
- ADD USER ALIYUN$xxxx@aliyun.com;
- GRANT createInstance ON project prj_name TO USER ALIYUN$xxxx@aliyun.com;
- GRANT Describe,Select,alter,update,drop ON TABLE table_name TO USER ALIYUN$xxxx@aliyun.com;
导出命令
类似于普通的SQL查询语句,用户也可通过类似于DML语句进行数据导出。
语法格式:
- DUMP DATA
- [OVERWRITE] INTO 'odps://project_name/table_name'
- SELECT C1, C2 FROM DB1.TABLE1 WHERE C1 = 'xxxx' LIMIT N
通过类DML语句导出到OSS(当前为公测功能,非商业化使用)
导出到OSS时,需要持有对该oss bucket有写权限的AK(为安全起见,必须使用子账号的AK)。
语法格式:
- /*+ dump-col-del=[,],dump-row-del=[\n],dump-oss-accesskey-id=oss的ACCESS_KEY_ID,
- dump-oss-accesskey-secret=oss的ACCESS_KEY_SECRET*/ DUMP DATA
- [OVERWRITE] INTO 'oss://endpoint_domain/bulket_name/filename'
- SELECT C1, C2 FROM DB1.TABLE1 WHERE C1 = 'xxxx' LIMIT N
说明:
- endpoint_domain是与ads同一个region的oss的内网endpoint,跨region访问时需要填写oss的公网endpoint(部分region之间可能无法跨region访问oss)。
- 部分情况下,目前可能会dump oss失败(dump下的sql中有分区倾斜时)
- dump-col-del=[,],dump-row-del=[\n] 用于规定导出文件的行列分隔符,可不填。
关于返回数据行数
导出方式对海量数据的计算输出具有良好的性能(百万行数据导出在数百毫秒数据级),但是,对于数据精确度有一定牺牲,即实际返回的数据行数,可能是不完全精确。以限制导出行数为1000为例(LIMIT1000):
- 实际数据行数可能稍大于1000,例如此时有120个数据分片,则等同于每个分区明确指定”LIMIT9”,最多肯能返回1080
- 实际数据行数可能稍小于1000,如果符合条件的行数的总数小于1000
- 实际数据行数可能稍小于1000,如果数据分片很均匀,例如此时有120个数据分片,如果某些分片返回数据行小于9的话,则等同于每个分区明确指定”LIMIT9”