全部产品
MaxCompute

访问Table Store非结构化数据

更新时间:2017-09-19 11:11:06   分享:   

表格存储(Table Store)是构建在阿里云飞天分布式系统之上的 NoSQL 数据存储服务,提供海量结构化数据的存储和实时访问。您可以通过 TableStore文档 对其进行了解。

MaxCompute 与 TableStore 是两个独立的大数据计算和存储服务,所以两者之间的网络必须保证连通性。MaxCompute 公共云服务访问 TableStore 存储时,推荐使用 TableStore 私网地址,也就是 host 名以 ots-internal.aliyuncs.com 作为结尾的地址,例如:tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com。

之前我们介绍了怎样 访问 OSS 非结构化数据,本文将进一步介绍如何将来自 TableStore(OTS) 的数据纳入 MaxCompute 上的计算生态,实现多种数据源之间的无缝连接。

TableStore 与 MaxCompute 都有其自身的类型系统。在 MaxCompute 处理 TableStore 数据的时候,两者之间的类型对应关系如下:

MaxCompute Type TableStore Type
STRING STRING
BIGINT INTEGER
DOUBLE DOUBLE
BOOLEAN BOOLEAN
BINARY BINARY

1. 使用 STS/RAM 的方式访问 Table Store 数据

MaxCompute 计算服务访问 Table Store 数据需要有一个安全的授权通道。在这个问题上,MaxCompute 结合了阿里云的访问控制服务(RAM)和令牌服务(STS)来实现对数据的安全访问,详情如下:

1.1 授予权限

方式一

可以登录阿里云账号后 点击此处完成一键授权

方式二

需自定义授权,首先在 RAM 控制台中授予 MaxCompute 访问 Table Store 的权限。登录 RAM 控制台,创建角色 AliyunODPSDefaultRole,并将策略内容设置为:

  1. {
  2. "Statement": [
  3. {
  4. "Action": "sts:AssumeRole",
  5. "Effect": "Allow",
  6. "Principal": {
  7. "Service": [
  8. "odps.aliyuncs.com"
  9. ]
  10. }
  11. }
  12. ],
  13. "Version": "1"
  14. }

编辑该角色的授权策略AliyunODPSRolePolicy:

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Action": [
  6. "ots:ListTable",
  7. "ots:DescribeTable",
  8. "ots:GetRow",
  9. "ots:PutRow",
  10. "ots:UpdateRow",
  11. "ots:DeleteRow",
  12. "ots:GetRange",
  13. "ots:BatchGetRow",
  14. "ots:BatchWriteRow",
  15. "ots:ComputeSplitPointsBySize"
  16. ],
  17. "Resource": "*",
  18. "Effect": "Allow"
  19. }
  20. ]
  21. }
  22. --还可自定义其他权限

再将权限AliyunODPSRolePolicy授权给该角色。

1.2 创建外部表

MaxCompute 通过创建外部表, 把对 TableStore 表数据的描述引入到 MaxCompute 的 meta 系统内部后,即可轻松实现对 TableStore 数据的处理。本节将以下面的示例来说明 MaxCompute 对接 TableStore 的一些概念和实现。

建外部表语句如下:

  1. DROP TABLE IF EXISTS ots_table_external;
  2. CREATE EXTERNAL TABLE IF NOT EXISTS ots_table_external
  3. (
  4. odps_orderkey bigint,
  5. odps_orderdate string,
  6. odps_custkey bigint,
  7. odps_orderstatus string,
  8. odps_totalprice double
  9. )
  10. STORED BY 'com.aliyun.odps.TableStoreStorageHandler' -- (1)
  11. WITH SERDEPROPERTIES ( -- (2)
  12. 'tablestore.columns.mapping'=':o_orderkey,:o_orderdate,o_custkey, o_orderstatus,o_totalprice', -- (3)
  13. 'tablestore.table.name'='ots_tpch_orders' -- (4)
  14. )
  15. LOCATION 'tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com'; -- (5)

说明:

(1)com.aliyun.odps.TableStoreStorageHandler 是 MaxCompute 内置的处理 TableStore 数据的 StorageHandler,定义了 MaxCompute 和 TableStore 的交互,相关逻辑由 MaxCompute 实现。

(2)SERDEPROPERITES 是提供参数选项的接口,在使用 TableStoreStorageHandler 时,有两个必须指定的选项,分别是下面将会介绍的 tablestore.columns.mapping 和 tablestore.table.name。

(3)tablestore.columns.mapping 选项:必需选项,用来描述 MaxCompute 将访问的 Table Store 表的列,包括主键和属性列。其中,以:打头的用来表示 Table Store 主键,例如此语句中的 :o_orderkey:o_orderdate,其他的均为属性列。 Table Store 支持1-4个主键,主键类型为 String、Integer 和 Binary,其中第一个主键为分区键。在指定映射的时候,用户必须提供指定 Table Store 表的所有主键,对于属性列则没有必要全部提供,可以只提供需要通过 MaxCompute 来访问的属性列。

(4)tablestore.table.name:需要访问的 TableStore 表名。如果指定的 TableStore 表名错误(不存在),则会报错,MaxCompute 不会主动去创建 TableStore 表。

(5)LOCATION clause 用来指定 Table Store 的具体信息,包括 instance 名字、endpoint 等。这里的 TableStore 数据的安全访问是建立在前文介绍的 RAM/STS 授权的前提上的。

1.3 通过 External Table 访问 TableStore 数据

创建 External Table 后,Table Store 的数据便引入到了 MaxCompute 生态中,即可通过正常的 MaxCompute SQL 语法来访问 TableStore 数据了,如下所示:

  1. SELECT odps_orderkey, odps_orderdate, SUM(odps_totalprice) AS sum_total
  2. FROM ots_table_external
  3. WHERE odps_orderkey > 5000 AND odps_orderkey < 7000 AND odps_orderdate >= '1996-05-03' AND odps_orderdate < '1997-05-01'
  4. GROUP BY odps_orderkey, odps_orderdate
  5. HAVING sum_total> 400000.0;

由上可见,使用常见的 MaxCompute SQL 语法,访问 TableStore 的所有细节由 MaxCompute 内部处理。这包括在列名的选择上,比如上面的SQL中,使用的列名是 odps_orderkey,odps_totalprice 等,而不是原始 TableStore 里面的主键名 o_orderkey 或属性列名 o_totalprice,因为在创建 External Table 的 DDL 语句里,已经做了对应的 mapping。当然您也可根据自己的需求在创建 External Table 时选择保留原始的 TableStore 主键/列名。

如果需要对一份数据做 多次计算,相较每次从 TableStore 去远程读数据,有个更高效的办法是先一次性把需要的数据导入到 MaxCompute 内部成为一个MaxCompute(内部)表,比如:

  1. CREATE TABLE internal_orders AS
  2. SELECT odps_orderkey, odps_orderdate, odps_custkey, odps_totalprice
  3. FROM ots_table_external
  4. WHERE odps_orderkey > 5000 ;

现在 internal_orders 就是一个 MaxCompute 表了,也拥有所有 MaxCompute 内部表的特性,包括:高效的压缩列存储数据格式,完整的内部宏数据以及统计信息等。同时因为存储在 MaxCompute 内部,访问速度会比访问外部的 TableStore 更快,尤其适用于需要进行多次计算的热点数据。

2. MaxCompute 导出数据到 TableStore

注意:MaxCompute 不会主动创建外部的 TableStore 表,所以在对 TableStore 表进行数据输出之前,必须保证该表已经在 TableStore 上创建过(否则将报错)。

根据上面的操作,您已创建了外部表 ots_table_external 来打通 MaxCompute 与 TableStoreb 数据表 ots_tpch_orders 的链路, 同时还有一份存储在 MaxCompute 内部表 internal_orders 的数据,现在希望对 internal_orders 中的数据进行一定处理后再写回 TableStore 上,可通过对外部表做 INSERT OVERWITE TABLE 操作来实现,如下所示:

  1. INSERT OVERWRITE TABLE ots_table_external
  2. SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
  3. FROM internal_orders;

对于 TableStore 这种 KV 数据的 NoSQL 存储介质,从 MaxCompute 的输出将只影响相对应主键所在的行,比如示例中只影响所有 odps_orderkey + odps_orderdate 这两个主键值能对应行上的数据。而且在这些 TabeleStore 行上面,也只会去更新在创建 External Table (ots_table_external) 时指定的属性列,而不会去修改未在 External Table 里面出现的数据列。更多详情请参见:https://yq.aliyun.com/articles/69314

本文导读目录
本文导读目录
以上内容是否对您有帮助?