

# 将 Aurora PostgreSQL 扩展与 Babelfish 搭配使用
<a name="babelfish-postgres-aws-extensions"></a>

Aurora PostgreSQL 提供了与其他 Amazon 服务搭配使用的扩展。这些是支持各种使用案例的可选扩展，例如将 Amazon S3 与数据库集群搭配使用来导入或导出数据。
+ 要将数据从 Amazon S3 桶导入 Babelfish 数据库集群，可以设置 `aws_s3` Aurora PostgreSQL 扩展。此扩展还允许将数据从 Aurora PostgreSQL 数据库集群导出到 Amazon S3 存储桶。
+ Amazon Lambda 是一项计算服务，可使您无需调配或管理服务器即可运行代码。您可以使用 Lambda 函数完成许多任务，例如处理来自数据库实例的事件通知。若要了解 Lambda 的更多信息，请参阅《Amazon Lambda 开发人员指南**》中的[什么是 Amazon Lambda？](https://docs.amazonaws.cn/lambda/latest/dg/welcome.html) 要从 Babelfish 数据库集群调用 Lambda 函数，您可以设置 `aws_lambda` Aurora PostgreSQL 扩展。

要为 Babelfish 集群设置这些扩展，首先需要向内部 Babelfish 用户授予加载扩展的权限。授予权限后，您就可以加载 Aurora PostgreSQL 扩展程序。

## 在 Babelfish 数据库集群中启用 Aurora PostgreSQL 扩展
<a name="babelfish-postgres-aws-extensions-enabling"></a>

必须向 Babelfish 数据库集群授予所需权限，才能加载 `aws_s3` 或者 `aws_lambda` 扩展。

以下过程使用 `psql` PostgreSQL 命令行工具连接到该数据库集群。有关更多信息，请参阅 [使用 psql 连接到数据库集群](babelfish-connect-PostgreSQL.md#babelfish-connect-psql)。您还可以使用 pgAdmin。有关更多信息，请参阅 [使用 pgAdmin 连接到数据库集群](babelfish-connect-PostgreSQL.md#babelfish-connect-pgadmin)。

此过程将先后加载 `aws_s3` 和 `aws_lambda`。如果只想使用其中一个扩展，则无需同时加载两个扩展。各种情况都需要 `aws_commons` 扩展，因此会默认加载该扩展，如输出中所示。

**使用 Aurora PostgreSQL 扩展的权限设置 Babelfish 数据库集群**

1. 连接到 Babelfish 数据库集群。使用创建 Babelfish 数据库集群时指定的“主”用户名 (-U)。默认名称 (`postgres`) 如示例所示。

   对于 Linux、macOS 或 Unix：

   ```
   psql -h {{your-Babelfish.cluster.444455556666-us-east-1.rds.amazonaws.com}} \
   -U postgres \
   -d babelfish_db \
   -p 5432
   ```

   对于：Windows

   ```
   psql -h {{your-Babelfish.cluster.444455556666-us-east-1.rds.amazonaws.com}} ^
   -U postgres ^
   -d babelfish_db ^
   -p 5432
   ```

   该命令将提示输入用户名 (-U) 的密码。

   ```
   Password:
   ```

   输入数据库集群用户名 (-U) 的密码。成功连接后，便可看到类似以下内容的输出。

   ```
   psql (13.4)
   SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
   Type "help" for help.
   
   postgres=>
   ```

1. 向内部 Babelfish 用户授予创建和加载扩展的权限。

   ```
   babelfish_db=> GRANT rds_superuser TO master_dbo;
   GRANT ROLE
   ```

1. 创建并加载 `aws_s3` 扩展。`aws_commons` 扩展是必要扩展，会在 `aws_s3` 安装时自动安装。

   ```
   babelfish_db=> create extension aws_s3 cascade;
   NOTICE:  installing required extension "aws_commons"
   CREATE EXTENSION
   ```

1. 创建并加载 `aws_lambda` 扩展。

   ```
   babelfish_db=> create extension aws_lambda cascade;
   CREATE EXTENSION
   babelfish_db=>
   ```

## 将 Babelfish 与 Amazon S3 搭配使用
<a name="babelfish-postgres-aws-extensions-using-aws_s3"></a>

如果尚无可与 Babelfish 数据库集群搭配使用的 Amazon S3 存储桶，可以创建一个。您可以向要使用的任何 Amazon S3 存储桶提供访问权限。

请完成以下一次性步骤，再尝试使用 Amazon S3 存储桶导入或导出数据。

**为 Babelfish 数据库实例设置对 Amazon S3 存储桶的访问权限**

1. 根据需要为 Babelfish 实例创建 Amazon S3 存储桶。为此，请参照《Amazon Simple Storage Service User Guide》**的 [Create a bucket](https://docs.amazonaws.cn/AmazonS3/latest/userguide/CreatingABucket.htmlurl-s3-user;GetStartedWithS3.html#creating-bucket) 中的说明。

1. 将文件上传到 Amazon S3 存储桶。为此，请参照《Amazon Simple Storage Service User Guide》**的 [Add an object to a bucket](https://docs.amazonaws.cn/AmazonS3/latest/userguide/PuttingAnObjectInABucket.htmlurl-s3-user;GetStartedWithS3.html#uploading-an-object-bucket) 中的步骤。

1. 根据需要设置权限：
   + 要从 Amazon S3 导入数据，Babelfish 数据库集群需要获得访问桶的权限。建议使用 Amazon Identity and Access Management (IAM) 角色，并将 IAM 策略附加到集群的该角色。为此，请按照[使用 IAM 角色访问 Amazon S3 存储桶](USER_PostgreSQL.S3Import.AccessPermission.md#USER_PostgreSQL.S3Import.ARNRole)中的步骤进行操作。
   + 要从 Babelfish 数据库集群导出数据，必须向集群授予对 Amazon S3 桶的访问权限。与导入一样，建议使用 IAM 角色和策略。为此，请按照[设置 Amazon S3 存储桶的访问权限](postgresql-s3-export-access-bucket.md)中的步骤进行操作。

现在，您可以将带有 `aws_s3` 扩展的 Amazon S3 与 Babelfish 数据库集群搭配使用。

**将数据从 Amazon S3 导入 Babelfish 以及将 Babelfish 数据导出到 Amazon S3**

1. 将 `aws_s3` 扩展与 Babelfish 数据库集群搭配使用。

   这样做时，请务必参考 PostgreSQL 上下文中存在的表格。也就是说，如果想导入名为 `[database].[schema].[tableA]` 的 Babelfish 表，则在 `aws_s3` 函数中将该表称为 `database_schema_tableA`：
   + 有关使用 `aws_s3` 函数导入数据的示例，请参阅 [将数据从 Amazon S3 导入到 Aurora PostgreSQL 数据库集群](USER_PostgreSQL.S3Import.FileFormats.md)。
   + 有关使用 `aws_s3` 函数导出数据的示例，请参见 [使用 aws\_s3.query\_export\_to\_s3 函数导出查询数据](postgresql-s3-export-examples.md)。

1. 在使用 `aws_s3` 扩展和 Amazon S3 时，请务必使用 PostgreSQL 命名参考 Babelfish 表，如下表所示。


| Babelfish 表 | Aurora PostgreSQL 表 | 
| --- | --- | 
| `{{database}}.{{schema}}.{{table}}` | `{{database}}_{{schema}}_{{table}}` | 

若要了解有关将 Amazon S3 与 Aurora PostgreSQL 搭配使用的更多信息，请参阅 [将 Amazon S3 中的数据导入到 Aurora PostgreSQL 数据库集群](USER_PostgreSQL.S3Import.md) 和 [将数据从 Aurora PostgreSQL 数据库集群导出到 Amazon S3](postgresql-s3-export.md)。

## 将 Babelfish 和 Amazon Lambda 搭配使用
<a name="babelfish-postgres-aws-extensions-using-aws_lambda"></a>

在 `aws_lambda` 扩展已加载到 Babelfish 数据库集群中之后，但在 Lambda 函数可以调用之前，您可以按照此过程授予 Lambda 对数据库集群的访问权限。

**为 Babelfish 数据库集群设置访问权限以使用 Lambda**

此过程使用 Amazon CLI 创建 IAM 策略和角色，并将其与 Babelfish 数据库集群关联。

1. 创建允许从 Babelfish 数据库集群访问 Lambda 的 IAM 策略。

   ```
   aws iam create-policy  --policy-name {{rds-lambda-policy}} --policy-document '{
   	"Version": "2012-10-17",		 	 	 
       "Statement": [
           {
           "Sid": "AllowAccessToExampleFunction",
           "Effect": "Allow",
           "Action": "lambda:InvokeFunction",
           "Resource": "arn:aws:lambda:{{{{aws-region}}:444455556666:function:my-function}}"
           }
       ]
   }'
   ```

1. 创建该策略可在运行时承担的 IAM 角色。

   ```
   aws iam create-role  --role-name {{rds-lambda-role}} --assume-role-policy-document '{
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
           "Effect": "Allow",
           "Principal": {
               "Service": "rds.amazonaws.com"
           },
           "Action": "sts:AssumeRole"
           }
       ]
   }'
   ```

1. 将 策略附加到该角色。

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws:iam::{{444455556666}}:policy/{{rds-lambda-policy}} \
       --role-name {{rds-lambda-role}} --region {{aws-region}}
   ```

1. 向 Babelfish 数据库集群附加角色

   ```
   aws rds add-role-to-db-cluster \
          --db-cluster-identifier {{my-cluster-name}} \
          --feature-name Lambda \
          --role-arn  arn:aws:iam::{{444455556666:role/rds-lambda-role}}   \
          --region {{aws-region}}
   ```

完成这些任务之后，您可以调用 Lambda 函数。有关使用 Amazon Lambda 为 Aurora PostgreSQL 数据库集群设置 Amazon Lambda 的更多信息和示例，请参阅 [步骤 2：为 Aurora PostgreSQL 数据库集群和 Amazon Lambda 配置 IAM](PostgreSQL-Lambda.md#PostgreSQL-Lambda-access)。

**从 Babelfish 数据库集群调用 Lambda 函数**

Amazon Lambda 支持使用 Java、Node.js、Python、Ruby 和其他语言编写的函数。如果调用该函数时返回文本，则可以从 Babelfish 数据库集群中调用它。以下示例是返回问候语的占位符 Python 函数。

```
lambda_function.py
import json
def lambda_handler(event, context):
    #TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
```

目前，Babelfish 不支持 JSON。如果函数返回 JSON，则可使用包装器来处理 JSON。例如，假设之前显示的 `lambda_function.py` 作为 `my-function` 存储在 Lambda 中。

1. 使用 `psql` 客户端（或 pgAdmin 客户端）连接到 Babelfish 数据库集群。有关更多信息，请参阅 [使用 psql 连接到数据库集群](babelfish-connect-PostgreSQL.md#babelfish-connect-psql)。

1. 创建包装器。此示例使用 PostgreSQL 的 SQL 程序语言：`PL/pgSQL`。要了解详情，请参阅 [PL/pgSQL–SQL 程序语言](https://www.postgresql.org/docs/13/plpgsql.html)。

   ```
   create or replace function master_dbo.lambda_wrapper()
   returns text
   language plpgsql
   as
   $$
   declare
      r_status_code integer;
      r_payload text;
   begin
      SELECT payload INTO r_payload
        FROM aws_lambda.invoke(  aws_commons.create_lambda_function_arn('my-function', 'us-east-1')
                               ,'{"body": "Hello from Postgres!"}'::json );
      return r_payload ;
   end;
   $$;
   ```

   该函数现在可以从 Babelfish TDS 端口 (1433) 或从 PostgreSQL 端口 (5433) 运行。

   1. 若要从 PostgreSQL 端口调用此函数：

      ```
      SELECT * from aws_lambda.invoke(aws_commons.create_lambda_function_arn('my-function', 'us-east-1'), '{"body": "Hello from Postgres!"}'::json );
      ```

      输出类似于以下内容：

      ```
      status_code |                        payload                        | executed_version | log_result
      -------------+-------------------------------------------------------+------------------+------------
               200 | {"statusCode": 200, "body": "\"Hello from Lambda!\""} | $LATEST          |
      (1 row)
      ```

   1. 若要从 TDS 端口调用此函数，请使用 SQL Server `sqlcmd` 命令行客户端连接到此端口。有关更多信息，请参阅 [使用 SQL Server 客户端连接到数据库集群](babelfish-connect-sqlserver.md)。连接后，运行以下命令：

      ```
      1> select lambda_wrapper();
      2> go
      ```

      该命令返回的输出类似于下方内容：

      ```
      {"statusCode": 200, "body": "\"Hello from Lambda!\""}
      ```

若要了解有关将 Lambda 与 Aurora PostgreSQL 搭配使用的更多信息，请参阅 [从 Aurora PostgreSQL 数据库集群 中调用 Amazon Lambda 函数](PostgreSQL-Lambda.md)。有关使用 Lambda 函数的更多信息，请参阅《Amazon Lambda 开发人员指南**》中的 [Lambda 入门](https://docs.amazonaws.cn/lambda/latest/dg/getting-started.html)。

## 在 Babelfish 中使用 pg\_stat\_statements
<a name="babelfish-postgres-aws-extensions-using-pgstat"></a>

从 3.3.0 开始，适用于 Aurora PostgreSQL 的 Babelfish 支持 `pg_stat_statements` 扩展。要了解更多信息，请参阅 [pg\_stat\_statements](https://www.postgresql.org/docs/current/pgstatstatements.html)。

有关 Aurora PostgreSQL 支持的这一扩展的版本详细信息，请参阅[扩展版本](https://docs.amazonaws.cn/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraPostgreSQL.Extensions.html)。

### 创建 pg\_stat\_statements 扩展
<a name="babelfish-postgres-aws-extensions-using-pgstat-install"></a>

要开启 `pg_stat_statements`，必须开启查询标识符计算。如果在参数组中将 `compute_query_id` 设置为 `on` 或 `auto`，则会自动完成此操作。`compute_query_id` 参数的默认值为 `auto`。您还需要创建此扩展，才能开启此功能。使用以下命令从 T-SQL 端点安装扩展：

```
				
1>EXEC sp_execute_postgresql 'CREATE EXTENSION pg_stat_statements WITH SCHEMA sys';
```

您可以使用以下查询访问查询统计信息：

```
postgres=>select * from pg_stat_statements; 
```

**注意**  
在安装过程中，如果您不提供扩展的模式名称，则默认情况下，将在公共模式中创建名称。要进行访问，必须对模式限定符使用方括号，如下所示：

```
postgres=>select * from [public].pg_stat_statements;
```

您还可以从 PSQL 端点创建扩展。

### 授权扩展
<a name="babelfish-postgres-aws-extensions-using-pgstat-authorization"></a>

默认情况下，无需任何授权即可查看在 T-SQL 数据库中执行的查询的统计信息。

要访问其他人创建的查询统计信息，您需要拥有 `pg_read_all_stats` PostgreSQL 角色。按照下面提到的步骤构建 GRANT pg\_read\_all\_stats 命令。

1. 在 T-SQL 中，使用以下返回内部 PG 角色名称的查询。

   ```
   SELECT rolname FROM pg_roles WHERE oid = USER_ID();
   ```

1. 使用 rds\_superuser 权限连接到适用于 Aurora PostgreSQL 的 Babelfish 数据库，然后使用以下命令：

   ```
   GRANT pg_read_all_stats TO <rolname_from_above_query>
   ```

**示例**  
从 T-SQL 端点：

```
1>SELECT rolname FROM pg_roles WHERE oid = USER_ID();
2>go
```

```
rolname
-------
master_dbo
(1 rows affected)
```

从 PSQL 端点：

```
babelfish_db=# grant pg_read_all_stats to master_dbo;
```

```
GRANT ROLE
```

您可以使用 pg\_stat\_statements 视图访问查询统计信息：

```
1>create table t1(cola int);
2>go
1>insert into t1 values (1),(2),(3);
2>go
```

```
(3 rows affected)
```

```
1>select userid, dbid, queryid, query from pg_stat_statements;
2>go
```

```
userid dbid queryid             query
------ ---- -------             -----
37503 34582 6487973085327558478 select * from t1
37503 34582 6284378402749466286 SET QUOTED_IDENTIFIER OFF
37503 34582 2864302298511657420 insert into t1 values ($1),($2),($3)
10    34582 NULL                <insufficient privilege>
37503 34582 5615368793313871642 SET TEXTSIZE 4096
37503 34582 639400815330803392  create table t1(cola int)
(6 rows affected)
```

### 重置查询统计信息
<a name="babelfish-postgres-aws-extensions-using-pgstat-reset"></a>

您可以使用 `pg_stat_statements_reset()` 重置 pg\_stat\_statements 到目前为止收集的统计信息。要了解更多信息，请参阅 [pg\_stat\_statements]( https://www.postgresql.org/docs/current/pgstatstatements.html)。目前仅通过 PSQL 端点支持它。使用 `rds_superuser` 权限连接到适用于 Aurora PostgreSQL 的 Babelfish，然后使用以下命令：

```
SELECT pg_stat_statements_reset();
```

### 限制
<a name="babelfish-postgres-aws-extensions-using-pgstat-limitations"></a>
+ 目前，通过 T-SQL 端点不支持 `pg_stat_statements()`。`pg_stat_statements` 视图是推荐的收集统计信息的方法。
+ 有些查询可能会由 Aurora PostgreSQL 引擎实现的 T-SQL 解析器重新写入，`pg_stat_statements` 视图将显示重新写入的查询，而不是原始查询。

  示例

  ```
  select next value for [dbo].[newCounter];
  ```

   在 pg\_stat\_statements 视图中，上述查询被重新写入为以下内容。

  ```
  select nextval($1);
  ```
+ 根据语句的执行流程，pg\_stat\_statements 可能无法跟踪某些查询，因此在视图中也看不见这些查询。这包括以下语句：`use dbname`、`goto`、`print`、`raise error`、`set`、`throw`、`declare cursor`。
+ 对于 CREATE LOGIN 和 ALTER LOGIN 语句，将不显示查询和查询 ID。它将显示权限不足。
+ `pg_stat_statements` 视图始终包含以下两个条目，因为它们是由 `sqlcmd` 客户端在内部执行。
  + SET QUOTED\_IDENTIFIER OFF
  + SET TEXTSIZE 4096

## 在 Babelfish 中使用 pgvector
<a name="babelfish-postgres-aws-extensions-using-pgvector"></a>

pgvector 是一个开源扩展，它允许您直接在 Postgres 数据库中搜索类似的数据。从版本 15.6 和 16.2 开始，Babelfish 支持此扩展。有关更多信息，请参阅 [pgvector 开源文档](https://github.com/pgvector/pgvector)。

### 先决条件
<a name="babelfish-postgres-aws-extensions-using-pgvector-prereq"></a>

要启用 pgvector 功能，请使用以下方法之一在 sys 架构中安装该扩展：
+ 在 sqlcmd 客户端运行以下命令：

  ```
  exec sys.sp_execute_postgresql 'CREATE EXTENSION vector WITH SCHEMA sys';
  ```
+ 连接到 `babelfish_db` 并在 psql 客户端运行以下命令：

  ```
  CREATE EXTENSION vector WITH SCHEMA sys;
  ```

**注意**  
安装 pgvector 扩展后，矢量数据类型将仅在您建立的新数据库连接中可用。现有连接无法识别新的数据类型。

### 支持的功能
<a name="babelfish-postgres-aws-extensions-using-pgvector-supported"></a>

Babelfish 扩展了 T-SQL 功能以支持以下功能：
+ **存储**

  Babelfish 现在支持与矢量数据类型兼容的语法，从而增强了其 T-SQL 兼容性。要了解有关使用 pgvector 存储数据的更多信息，请参阅[存储](https://github.com/pgvector/pgvector?tab=readme-ov-file#storing)。
+ **查询**

   Babelfish 扩展了 T-SQL 表达式支持，以包括矢量相似度运算符。但是，对于所有其他查询，仍然需要标准 T-SQL 语法。
**注意**  
T-SQL 不支持数组类型，而且数据库驱动程序没有任何接口来处理它们。作为一种解决方法，Babelfish 使用文本字符串（varchar/nvarchar）来存储矢量数据。例如，当您请求向量值 [1,2,3] 时，Babelfish 将返回字符串“[1,2,3]”作为响应。您可以根据需要在应用程序级别解析和拆分此字符串。

  要了解有关使用 pgvector 查询数据的更多信息，请参阅[查询](https://github.com/pgvector/pgvector?tab=readme-ov-file#querying)。
+ **索引**

  T-SQL `Create Index` 现在支持 `USING INDEX_METHOD` 语法。现在，您可以定义在创建索引时用于特定列的相似度搜索运算符。

  该语法还进行了扩展，以支持对所需列进行向量相似度运算（查看 column\_name\_list\_with\_order\_for\_vector 语法）。

  ```
  CREATE [UNIQUE] [clustered] [COLUMNSTORE] INDEX <index_name> ON <table_name> [USING vector_index_method] (<column_name_list_with_order_for_vector>)
  Where column_name_list_with_order_for_vector is:
      <column_name> [ASC | DESC] [VECTOR_COSINE_OPS | VECTOR_IP_OPS | VECTOR_L2_OPS] (COMMA simple_column_name [ASC | DESC] [VECTOR_COSINE_OPS | VECTOR_IP_OPS | VECTOR_L2_OPS])
  ```

  要了解有关使用 pgvector 编制数据索引的更多信息，请参阅[索引](https://github.com/pgvector/pgvector?tab=readme-ov-file#indexing)。
+ **性能**：
  + 使用 `SET BABELFISH_STATISTICS PROFILE ON` 从 T-SQL 端点调试查询计划。
  + 使用 T-SQL 中支持的 `set_config` 函数增加 `max_parallel_workers_get_gather`。
  + 使用 `IVFFlat` 执行近似搜索。有关更多信息，请参阅 [IVFFlat](https://github.com/pgvector/pgvector?tab=readme-ov-file#ivfflat)。

  要使用 pgvector 提高性能，请参阅[性能](https://github.com/pgvector/pgvector?tab=readme-ov-file#performance)。

### 限制
<a name="babelfish-postgres-aws-extensions-using-pgvector-unsupported"></a>
+ Babelfish 不支持通过全文搜索进行混合搜索。有关更多信息，请参阅[混合搜索](https://github.com/pgvector/pgvector?tab=readme-ov-file#hybrid-search)。
+ Babelfish 目前不支持重新编制索引功能。但是，仍然可以使用 PostgreSQL 端点来重新编制索引。有关更多信息，请参阅[清空](https://github.com/pgvector/pgvector?tab=readme-ov-file#vacuuming)。

## 将 Amazon Aurora 机器学习与 Babelfish 结合使用
<a name="babelfish-postgres-aws-extensions-using-ml"></a>

您可以通过将 Babelfish for Aurora PostgreSQL 数据库集群与 Amazon Aurora 机器学习集成来扩展其功能。这种无缝集成使您可以访问一系列强大的服务，例如 Amazon Comprehend、Amazon SageMaker AI 或 Amazon Bedrock，这些服务都经过了定制，以满足不同的机器学习需求。

作为 Babelfish 用户，在与 Aurora 机器学习结合使用时，您可以利用现有的 T-SQL 语法和语义知识。按照 Aurora PostgreSQL Amazon 文档中提供的说明操作。有关更多信息，请参阅 [将 Amazon Aurora 机器学习与 Aurora PostgreSQL 结合使用](postgresql-ml.md)。

### 先决条件
<a name="babelfish-postgres-aws-extensions-using-ml-prereq"></a>
+ 在尝试将 Babelfish for Aurora PostgreSQL 数据库集群设置为使用 Aurora 机器学习之前，请务必了解以下要求和先决条件。有关更多信息，请参阅 [将 Aurora 机器学习与 Aurora PostgreSQL 结合使用的要求](postgresql-ml.md#postgresql-ml-prereqs)。
+ 确保使用 Postgres 端点或 `sp_execute_postgresql` 存储过程安装 `aws_ml` 扩展。

  ```
  exec sys.sp_execute_postgresql 'Create Extension aws_ml'
  ```
**注意**  
Babelfish 目前不支持在 Babelfish 中执行 `sp_execute_postgresql` 级联操作。由于 `aws_ml` 依赖 `aws_commons`，因此您需要使用 Postgres 端点单独安装它。

  ```
  create extension aws_common;
  ```

### 使用 `aws_ml` 函数处理 T-SQL 语法和语义
<a name="babelfish-postgres-aws-extensions-using-ml-examples"></a>

以下示例说明了如何将 T-SQL 语法和语义应用于 Amazon ML 服务：

**Example : aws\_bedrock.invoke\_model – 使用 Amazon Bedrock 函数的简单查询**  

```
aws_bedrock.invoke_model(
   model_id      varchar,
   content_type  text,
   accept_type   text,
   model_input   text)
Returns Varchar(MAX)
```
以下示例说明如何使用 invoke\_model 为 Bedrock 调用 Anthropic Claude 2 模型。  

```
SELECT aws_bedrock.invoke_model (
    'anthropic.claude-v2', -- model_id
    'application/json', -- content_type
    'application/json', -- accept_type
    '{"prompt": "\n\nHuman:
    You are a helpful assistant that answers questions directly
    and only using the information provided in the context below.
    \nDescribe the answerin detail.\n\nContext: %s \n\nQuestion:
    %s \n\nAssistant:","max_tokens_to_sample":4096,"temperature"
    :0.5,"top_k":250,"top_p":0.5,"stop_sequences":[]}' -- model_input
);
```

**Example : aws\_comprehend.detect\_sentiment – 使用 Amazon Comprehend 函数的简单查询**  

```
aws_comprehend.detect_sentiment(
   input_text varchar,
   language_code varchar,
   max_rows_per_batch int)
Returns table (sentiment varchar, confidence real)
```
以下示例说明了如何调用 Amazon Comprehend 服务。  

```
select sentiment from aws_comprehend.detect_sentiment('This is great', 'en');
```

**Example : aws\_sagemaker.invoke\_endpoint – 使用 Amazon SageMaker 函数的简单查询**  

```
aws_sagemaker.invoke_endpoint(
  endpoint_name varchar,   
  max_rows_per_batch int,
  VARIADIC model_input "any") -- Babelfish inherits PG's variadic parameter type
Rerurns Varchar(MAX)
```

由于 model\_input 标记为 VARIADIC 且类型为“any”，因此用户可以将任意长度和任何数据类型的列表传递给将充当模型输入的函数。以下示例说明了如何调用 Amazon SageMaker 服务。

```
SELECT CAST (aws_sagemaker.invoke_endpoint(
    'sagemaker_model_endpoint_name',
    NULL,
    arg1, arg2 -- model inputs are separate arguments )
AS INT) -- cast the output to INT
```

有关将 Amazon Aurora 机器学习与 Aurora PostgreSQL 结合使用的更多信息，请参阅[将 Amazon Aurora 机器学习与 Aurora PostgreSQL 结合使用](postgresql-ml.md)。

### 限制
<a name="babelfish-postgres-aws-extensions-using-ml-limit"></a>
+ 虽然 Babelfish 不允许创建数组，但它仍然可以处理表示数组的数据。当您使用类似 `aws_bedrock.invoke_model_get_embeddings` 这样能够返回数组的函数时，结果将以包含数组元素的字符串的形式传递。