

# 连接到 Domo
<a name="connecting-to-data-domo"></a>

Domo 是一款基于云的控制面板制作工具。借助 Domo 的企业应用程序平台，扩展 Domo 所需的基础已经到位，可以更快地构建自定义解决方案。

**Topics**
+ [AWS Glue 对 Domo 的支持](domo-support.md)
+ [包含创建和使用连接的 API 操作的策略](domo-configuring-iam-permissions.md)
+ [配置 Domo](domo-configuring.md)
+ [配置 Domo 连接](domo-configuring-connections.md)
+ [从 Domo 实体中读取内容](domo-reading-from-entities.md)
+ [Domo 连接选项](domo-connection-options.md)
+ [Domo 限制](domo-connection-limitations.md)

# AWS Glue 对 Domo 的支持
<a name="domo-support"></a>

AWS Glue 对 Domo 的支持情况如下：

**是否支持作为来源？**  
是。可以使用 AWS Glue ETL 作业查询 Domo 中的数据。

**是否支持作为目标？**  
否。

**支持的 Domo API 版本**  
支持以下 Domo API 版本：
+ v1

# 包含创建和使用连接的 API 操作的策略
<a name="domo-configuring-iam-permissions"></a>

以下示例策略描述了创建和使用连接所需的 AWS IAM 权限。如果您要创建新角色，请创建包含以下内容的策略：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListConnectionTypes",
        "glue:DescribeConnectionType",
        "glue:RefreshOAuth2Tokens",
        "glue:ListEntities",
        "glue:DescribeEntity"
      ],
      "Resource": "*"
    }
  ]
}
```

------

如果您不想使用上述方法，也可以使用以下托管 IAM 策略：
+ [AWSGlueServiceRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole) – 授予对各种 AWS Glue 进程代表您运行所需的资源的访问权限。这些资源包括 AWS Glue、Amazon S3、IAM、CloudWatch Logs 和 Amazon EC2。如果您遵循此策略中指定的资源的命名约定，则 AWS Glue 进程具有所需的权限。此策略通常附加到在定义爬网程序、作业和开发终端节点时指定的角色。
+ [AWSGlueConsoleFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess)：当策略所附加到的身份使用 AWS 管理控制台时，授予对 AWS Glue 资源的完全访问权限。如果遵循此策略中指定的资源的命名约定，则用户具有完全控制台功能。此策略通常附加到 AWS Glue 控制台的用户。

# 配置 Domo
<a name="domo-configuring"></a>

必须满足以下要求，才能使用 AWS Glue 将数据从 Domo 传输到支持的目标：

## 最低要求
<a name="domo-configuring-min-requirements"></a>

以下是最低要求：
+ 拥有已启用 API 访问权限的 Domo 账户。
+ 在 Domo 开发者账户下创建应用程序，提供 AWS Glue 在对账户进行身份验证调用时用于安全访问数据的客户端凭证。有关更多信息，请参阅 [创建 Domo 开发者应用程序](#domo-configuring-creating-developer-app)。

如果满足这些要求，就可以将 AWS Glue 连接到 Domo 账户。

## 创建 Domo 开发者应用程序
<a name="domo-configuring-creating-developer-app"></a>

要获取客户端 ID 和客户端密钥，必须创建一个开发者账户。

1. 前往 [Domo 开发者登录页面](https://developer.domo.com/manage-clients)。

1. 选择**登录**。

1. 提供域名并点击**继续**。

1. 将鼠标悬停在**我的账户**上，然后选择**新客户端**。

1. 提供名称和描述并选择范围（数据），然后选择**创建**。

1. 从创建的新客户端中检索生成的**客户端 ID** 和**客户端密钥**。

# 配置 Domo 连接
<a name="domo-configuring-connections"></a>

Domo 支持 OAuth2 的 CLIENT\$1CREDENTIALS 授权类型。
+ 这种授权类型被认为是双足型 OAuth，因为只有客户端应用程序向服务器进行身份验证，无需用户参与。
+ 用户可以选择在 Domo 中创建自己的关联应用程序，并在通过 AWS Glue 控制台创建连接时，提供自己的客户端 ID 和客户端密钥。
+ 有关为授权码 OAuth 流创建关联应用程序的 Domo 公共文档，请参阅 [OAuth Authentication](https://developer.domo.com/portal/1845fc11bbe5d-api-authentication)。

要配置 Domo 连接，请执行以下操作：

1. 在 AWS Secrets Manager 中，创建一个包含以下详细信息的密钥：

   1. 对于客户管理型关联应用程序，密钥应包含关联应用程序的访问令牌，且以 `client_id` 和 `client_secret` 为键。

   1. 注意：必须在 AWS Glue 中为连接创建一个密钥。

1. 在 AWS Glue Glue Studio 中，按照以下步骤在**数据连接**下创建连接：

   1. 在**连接**下，选择**创建连接**。

   1. 选择**数据来源**时，请选择 Domo。

   1. 选择 AWS Glue 可以代入并有权执行以下操作的 AWS IAM 角色：

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "secretsmanager:DescribeSecret",
              "secretsmanager:GetSecretValue",
              "secretsmanager:PutSecretValue",
              "ec2:CreateNetworkInterface",
              "ec2:DescribeNetworkInterfaces",
              "ec2:DeleteNetworkInterface"
            ],
            "Resource": "*"
          }
        ]
      }
      ```

------

   1. 在 AWS Glue 中选择您要用于此连接的 `secretName`，然后放置令牌。

   1. 如果要使用网络，请选择网络选项。

1. 向与您的 AWS Glue 作业关联的 IAM 角色授予读取 `secretName` 的权限。

# 从 Domo 实体中读取内容
<a name="domo-reading-from-entities"></a>

**先决条件**

要从中读取内容的 Domo 对象。您会用到“数据集”或“数据权限策略”等对象名称。下表显示支持的实体。

**源支持的实体**：


| 实体 | 可以筛选 | 支持限制 | 支持排序依据 | 支持 Select \$1 | 支持分区 | 
| --- | --- | --- | --- | --- | --- | 
| 数据集 | 支持 | 是 | 是 | 是 | 是 | 
| 数据权限策略 | 否 | 否 | 否 | 是 | 否 | 

**示例：**

```
Domo_read = glueContext.create_dynamic_frame.from_options(
    connection_type="domo",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "dataset",
        "API_VERSION": "v1"
    }
```

## Domo 实体和字段详细信息
<a name="domo-reading-from-entities-field-details"></a>

具有静态元数据的实体：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/domo-reading-from-entities.html)

对于以下实体，Domo 提供用于动态获取元数据的端点，以便在实体的数据类型级别捕获运算符支持。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/domo-reading-from-entities.html)

## 对查询进行分区
<a name="domo-reading-from-partitioning"></a>

**基于字段的分区**

如果您想在 Spark 中利用并发，可以提供其他 Spark 选项：`PARTITION_FIELD`、`LOWER_BOUND`、`UPPER_BOUND` 和 `NUM_PARTITIONS`。使用这些参数，原始查询将被拆分为 `NUM_PARTITIONS` 个子查询，这些子查询可以由 Spark 任务同时执行。
+ `PARTITION_FIELD`：用于对查询进行分区的字段的名称。
+ `LOWER_BOUND`：所选分区字段的**包含**下限值。

  对于日期时间字段，我们接受 ISO 格式的值。

  有效值示例：

  ```
  "2023-01-15T11:18:39.205Z"
  ```

  对于“日期”字段，我们接受 ISO 格式的值。

  有效值示例：

  ```
  "2023-01-15"
  ```
+ `UPPER_BOUND`：所选分区字段的**排除**上限值。

  有效值示例：

  ```
  "2023-02-15T11:18:39.205Z"
  ```
+ `NUM_PARTITIONS`：分区的数量。

基于实体的分区字段支持详细信息如下表中所示：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/domo-reading-from-entities.html)

示例：

```
Domo_read = glueContext.create_dynamic_frame.from_options(
    connection_type="domo",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "dataset",
        "API_VERSION": "v1",
        "PARTITION_FIELD": "permissionTime"
        "LOWER_BOUND": "2023-01-15T11:18:39.205Z"
        "UPPER_BOUND": "2023-02-15T11:18:39.205Z"
        "NUM_PARTITIONS": "2"
    }
```

**基于记录的分区**

如果您想在 Spark 中利用并发，可以提供附加 Spark 选项 `NUM_PARTITIONS`。使用此参数，原始查询将被拆分为 `NUM_PARTITIONS` 个子查询，这些子查询可以由 Spark 任务同时执行。

在基于记录的分区中，从 Domo 查询存在的记录总数，然后将其除以提供的 `NUM_PARTITIONS` 数字。然后，每个子查询会同时获取生成的记录数。

示例：

```
Domo_read = glueContext.create_dynamic_frame.from_options(
    connection_type="domo",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "dataset",
        "API_VERSION": "v1",
        "NUM_PARTITIONS": "2"
    }
```

# Domo 连接选项
<a name="domo-connection-options"></a>

以下是 Domo 的连接选项：
+ `ENTITY_NAME`（字符串）：（必填）用于读取。Domo 中对象的名称。
+ `API_VERSION`（字符串）：（必填）用于读取。要使用的 Domo Rest API 版本。
+ `SELECTED_FIELDS`（列表<字符串>）–默认：empty(SELECT \$1)。用于读取。您想要为对象选择的列。
+ `FILTER_PREDICATE`（字符串）– 默认：空。用于读取。应采用 Spark SQL 格式。
+ `QUERY`（字符串）– 默认：空。用于读取。完整的 Spark SQL 查询。
+ `PARTITION_FIELD`（字符串）：用于读取。用于分区查询的字段。
+ `LOWER_BOUND`（字符串）：用于读取。所选分区字段的包含下限值。
+ `UPPER_BOUND`（字符串）：用于读取。所选分区字段的排除上限值。
+ `NUM_PARTITIONS`（整数）– 默认：1。用于读取。要读取的分区数。

# Domo 限制
<a name="domo-connection-limitations"></a>

以下是 Domo 的限制或注意事项：
+ 由于 SDK 的限制，对于以“\$1”开头的可查询字段（例如：\$1BATCH\$1ID），筛选无法按预期生效。
+ 由于 API 的限制，筛选会在提供日期之前的日期生效。这也会影响增量拉取。要克服此限制，请根据时区（UTC）选择一个日期，获取所需日期的数据。