摘要: 大数据计算服务 MaxCompute 可以提供强大的分析能力,而分布式 NoSQL 数据库表格存储在行级别上的实时更新和可覆盖性写入等特性,相对于 MaxCompute 内置表 append-only 批量操做,提供了一个很好的补充。html
关系数据库已经存在半个世纪,有很是普遍的使用场景,可是在快速迭代的互联网领域其扩展性和 schema 灵活性被诟病颇多,所以相似 TableStore/BigTable/HBase 等强调扩展性和灵活性的NoSQL数据库逐步流行起来,这些 NoSQL 数据库只提供 API 接口,不提供 SQL 访问,这就致使不少熟悉 SQL 可是不喜欢写代码的用户无法很舒服的使用此类NoSQL数据库。基于此,表格存储开发团队联合 MaxCompute(下文中 ODPS 与 MaxCompute 同义)团队打通了 ODPS-SQL 访问表格存储的路径,这样一个只懂 SQL 的用户也能够愉快的访问表格存储里面的大量数据了。git
本篇文章就以一个小白用户的身份体验如何使用 MaxCompute-SQL 查询表格存储里面的数据,以及如何开发自定义逻辑(User Defined Function, UDF)来处理用户特定的数据格式。sql
什么是表格存储 TableStore?数据库
分布式NoSQL数据存储服务,无缝支持单表PB级数据及百万级访问并发,弹性资源,按量计费,对数据高频的增、删、改支持的很好,保证单行数据读写的强一致性。json
什么是大数据计算服务 MaxCompute?api
一种快速、彻底托管的TB/PB级数据仓库解决方案,提供多种经典的分布式计算模型,可以更快速的解决用户海量数据计算问题。浏览器
下面首先咱们将介绍环境准备,这是全部后面的操做的基础。而后会介绍使用 OdpsCmd 访问表格存储。在第三节咱们介绍使用 OdpsStudio 访问表格存储。最后介绍如何写 UDF、部署 UDF 以及在查询中使用 UDF。网络
环境准备并发
首先,准备好一个 MaxCompute 的工程,工程建立指导文档,准备好AccessId和AccessKey备用,为了区别其余产品的AccessId和AccessKey,后面咱们称之为ODPS-AccessId,ODPS-AccessKey。并在RAM中受权 MaxCompute 访问 TableStore 的权限,受权方式请参考MaxCompute访问TableStore数据——受权app
小提示:因为 MaxCompute 在 2.0 版本的计算框架才能支持直接访问 TableStore 数据,该版本还在灰度上线中,目前还须要 申请MaxCompute 2.0试用,具体开通使用方法请参见 如何申请试用MaxCompute 2.0。
而后,准备好一个表格存储的实例以及一张数据表,表格存储实例管理,准备好实例名、EndPoint,为了区别其余产品的AccessId和AccessKey,后面咱们称之为TableStore-InstanceName,TableStore-EndPoint。
网络连通性
MaxCompute 与 TableStore 是两个独立的大数据计算以及大数据存储服务,因此二者之间的网络必须保证连通性。 对于 MaxCompute 公共云服务访问 TableStore 存储,推荐使用 TableStore 私网 地址,例如http://vehicle-test.cn-shanghai.ots-internal.aliyuncs.com。
若是网络不通,可使用公网地址,TableStore原生支持 VPC 网络控制,也须要将网络类型设置为 "容许任意网络访问"。
使用客户端 ODPS-CMD
1.下载并安装大数据计算服务客户端
2.下载解压,将conf/odps_config.ini 的内容修改成:
project_name=上面申请的ODPS工程名
access_id=ODPS-AccessId
access_key= ODPS-AccessKey
end_point=http://service-corp.odps.aliyun-inc.com/api
https_check=true
# confirm threshold for query input size(unit: GB)
data_size_confirm=100.0
# this url is for odpscmd update
update_url=http://repo.aliyun.com/odpscmd
3.行bin/odpscmd,输入show tables,正常执行则表示上面配置正确。
4.在bin/odpscmd 下输入环境变量,显式开启 ODPS 2.0 的非结构化功能( 仅在 ODPS 2.0 计算框架彻底上线为必须),单独执行 xx.sql 文件时也须要将下属设置写在 SQL 文件的开头处。
set odps.task.major.version=2dot0_demo_flighting;
set odps.sql.planner.mode=lot;
set odps.sql.ddl.odps2=true;
set odps.sql.preparse.odps2=lot;
set odps.sql.type.system.odps2=true; --是支持表格存储的binary类型
5.建立一张 MaxCompute 的数据表关联到 TableStore 的某一张表。
关联的数据表信息以下:
DROP TABLE IF EXISTS ots_vehicle_track;
CREATE EXTERNAL TABLE IF NOT EXISTS ots_vehicle_track
(
vid bigint,
gt bigint,
longitude double,
latitude double,
distance double ,
speed double,
oil_consumption double
)
STORED BY 'com.aliyun.odps.TableStoreStorageHandler' -- (1)
WITH SERDEPROPERTIES ( -- (2)
'tablestore.columns.mapping'=':vid, :gt, longitude, latitude, distance, speed, oil_consumption', -- (3)
'tablestore.table.name'='vehicle_track' -- (4)
)
LOCATION 'tablestore://vehicle-test.cn-shanghai.ots-internal.aliyuncs.com'; -- (5)
TableStore数据类型 |
MaxCompute数据类型 |
string |
string |
binary |
blob |
int |
bigint |
double |
double |
6.执行ODPS-SQL
// 统计编号 4 如下的车辆在时间戳 1469171387 之前的平均速度和平均油耗
select vid,count(*),avg(speed),avg(oil_consumption) from ots_vehicle_track where vid <4 and gt<1469171387 group by vid;
使用 UDF(User Defined Function)处理数据
有时候用户在表格存储里面的数据有独特的结构,但愿本身开发逻辑来处理每一行数据,好比解析特定的json字符串,这一块的开发也已经很方便了。
1.按照MaxCompute Studio文档的说明在IntelliJ里面安装MaxCompute-Java/MaxCompute-Studio插件,一旦插件安装完毕,就能够直接开发。
好比下面就是一个简单的 UDF 定义,只是简单的将两个字符串链接。 MaxCompute 支持更复杂的UDF,包括自定义窗口执行逻辑等,详细请参考MaxCompute Studio-开发 UDF。
2.打包以后能够上传到 MaxCompute,其中打包这里有须要注意的地方,File->Project Structure->Artifacts, 填写好 Name 和 Output Directory 后,要点击 + 选择输出模块,打包后经过 ODPS Project Explorer 来上传资源、建立函数,而后就能够在SQL中调用。
3.打开bin/odpscmd,输入
// 咱们选出来1行数据,并将name/name传入UDF,返回两个string的累加
select cloud_metric_extract_md5(name, name) as udf_test from test_table limit 1;
写在最后
目前ODPS-SQL访问 TaleStore 还在对执行逻辑进行深度的优化,若是有需求请联系ots_support,咱们将针对业务场景来进行优化。
FAQ
常见错误处理: