全部产品
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
MaxCompute

访问OTS非结构化数据

更新时间:2018-02-08 14:06:15

表格存储(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

STS模式授权

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

您可以通过以下两种方式授予权限:

  • 当MaxCompute和Table Store的Owner是同一个账号时,登录阿里云账号后 单击此处完成一键授权

  • 自定义授权。

    1. 首先在 RAM 控制台中授予 MaxCompute 访问 Table Store 的权限。登录 RAM 控制台若MaxCompute和Table Store不是同一个账号,此处需由Table Store账号登录进行授权),创建角色,角色名叫 AliyunODPSDefaultRole或AliyunODPSRoleForOtherUser 。

    2. 修改策略内容设置,如下所示:

      1. --当MaxComputeTable StoreOwner是同一个账号
      2. {
      3. "Statement": [
      4. {
      5. "Action": "sts:AssumeRole",
      6. "Effect": "Allow",
      7. "Principal": {
      8. "Service": [
      9. "odps.aliyuncs.com"
      10. ]
      11. }
      12. }
      13. ],
      14. "Version": "1"
      15. }
      16. --当MaxComputeTable StoreOwner不是同一个账号
      17. {
      18. "Statement": [
      19. {
      20. "Action": "sts:AssumeRole",
      21. "Effect": "Allow",
      22. "Principal": {
      23. "Service": [
      24. "MaxCompute的Owner云账号id@odps.aliyuncs.com"
      25. ]
      26. }
      27. }
      28. ],
      29. "Version": "1"
      30. }
    3. 编辑该角色的授权策略 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. --还可自定义其他权限
    4. 将权限 AliyunODPSRolePolicy 授权给该角色。

创建外部表

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. 'odps.properties.rolearn'='acs:ram::xxxxx:role/aliyunodpsdefaultrole'
  15. )
  16. LOCATION 'tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com'; -- (5)

语句说明如下:

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

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

    • tablestore.columns.mapping 选项:必选项,用来描述 MaxCompute 将访问的 Table Store 表的列,包括主键和属性列。

      • :打头的用来表示 Table Store 主键,例如此语句中的 :o_orderkey:o_orderdate,其他的均为属性列。

      • Table Store 支持 1-4 个主键,主键类型为 String、Integer 和 Binary,其中第一个主键为分区键。

      • 在指定映射时,您必须提供指定 Table Store 表的所有主键,对于属性列则没有必要全部提供,可以只提供需要通过 MaxCompute 来访问的属性列。

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

    • odps.properties.rolearn中的信息是 RAM 中AliyunODPSDefaultRole的Arn信息。您可以通过 RAM 控制台中的 角色详情 获取。

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

如果想查看创建好的外部表结构信息,可以执行语句:

  1. desc extended <table_name>;

在返回的信息里,除了跟内部表一样的基础信息外,“Extended Info”包含外部表StorageHandler 、Location 等信息。

查询外部表

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

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

如果需要对一份数据做 多次计算,相较每次从 Table Store 去远程读数据,有个更高效的办法是先一次性把需要的数据导入到 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 内部,访问速度会比访问外部的 Table Store 更快,尤其适用于需要进行多次计算的热点数据。

MaxCompute 导出数据到 Table Store

注意:

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

根据上面的操作,您已创建了外部表 ots_table_external 来打通 MaxCompute 与 Table Storeb 数据表 ots_tpch_orders 的链路, 同时还有一份存储在 MaxCompute 内部表 internal_orders 的数据,现在希望对 internal_orders 中的数据进行一定处理后再写回 Table Store 上,可通过对外部表做 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;

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

本文导读目录