

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 通过数据集导入作业将批量数据导入到 Amazon Personalize
<a name="bulk-data-import-step"></a>

格式化输入数据（请参阅[为 Amazon Personalize 准备训练数据](preparing-training-data.md)）并完成[创建架构和数据集](data-prep-creating-datasets.md)后，就可以通过数据集导入作业导入批量数据。*数据集导入作业*是一种批量导入工具，可通过 Amazon S3 中的数据填充数据集。

 要从 Amazon S3 导入数据，您的 CSV 文件必须在 Amazon S3 存储桶中，并且您必须向 Amazon Personalize 授予访问您的 Amazon S3 资源的权限：
+ 有关将文件上传到 Amazon S3 的信息，请参阅《Amazon Simple Storage Service 用户指南》中的[使用拖放功能上传文件和文件夹](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html)。
+ 若要了解如何向 Amazon Personalize 授予对 Amazon S3 中文件的访问权限，请参阅[向 Amazon Personalize 授予访问 Amazon S3 资源的权限](granting-personalize-s3-access.md)。

   如果您使用 AWS Key Management Service (AWS KMS) 进行加密，则必须向 Amazon Personalize 和 Amazon Personalize IAM 服务角色授予使用您的密钥的权限。有关更多信息，请参阅 [授予 Amazon Personalize 使用您的 AWS KMS 密钥的权限](granting-personalize-key-access.md)。

您可以使用 Amazon Personalize 控制台 AWS Command Line Interface （AWS CLI）或创建数据集导入任务 AWS SDKs。如果您之前为数据集创建了数据集导入作业，则可以使用新的数据集导入作业来添加或替换现有批量数据。有关更多信息，请参阅 [训练后更新数据集中的数据](updating-datasets.md)。

如果您导入的项目、用户或操作的 ID 与您的数据集中已有的一条记录的 ID 相同，则 Amazon Personalize 会将该记录替换为新记录。如果您记录了两个具有完全相同时间戳和相同属性的项目交互或操作交互事件，则 Amazon Personalize 将只保留其中一个事件。

 导入数据后，就可以创建域推荐器（适用于域数据集组）或自定义资源（适用于自定义数据集组），以根据您的数据训练模型。使用这些资源生成建议。有关更多信息，请参阅 [Amazon Personalize 中的域推荐器](creating-recommenders.md)或 [用于训练和部署 Amazon Personalize 模型的自定义资源](create-custom-resources.md)。



**Topics**
+ [导入模式](#bulk-import-modes)
+ [创建数据集导入作业（控制台）](#bulk-data-import-console)
+ [创建数据集导入作业（AWS CLI）](#bulk-data-import-cli)
+ [创建数据集导入作业（AWS SDKs）](#python-import-ex)

## 导入模式
<a name="bulk-import-modes"></a>

如果您已经为数据集创建导入作业，则可以配置 Amazon Personalize 如何添加新记录。为此，您需要为数据集导入作业指定导入模式。如果您尚未导入批量记录，则**导入模式**字段在控制台中不可用，您只能在 `CreateDatasetImportJob` API 操作中指定 `FULL`。默认为完整替换。
+ 要覆盖数据集中的所有现有批量数据，请在 Amazon Personalize 控制台中选择**替换现有数据**，或者在 [CreateDatasetImportJob](API_CreateDatasetImportJob.md) API 操作中指定 `FULL`。这不会取代您单独导入的数据，包括实时记录的事件。
+ 要将记录附加到数据集中的现有数据，请选择**添加到现有数据**，或在 `CreateDatasetImportJob` API 操作中指定 `INCREMENTAL`。Amazon Personalize 会将所有具有相同 ID 的记录替换为新记录。
**注意**  
要使用数据集导入作业将数据附加到物品交互数据集或操作交互数据集，您必须至少有 1000 条新的物品交互或操作交互记录。

## 创建数据集导入作业（控制台）
<a name="bulk-data-import-console"></a>

**重要**  
默认情况下，数据集导入作业会替换您批量导入的数据集中的任何现有数据。如果您已经导入了批量数据，则可以通过更改作业的[导入模式](#bulk-import-modes)来追加数据。

 要使用 Amazon Personalize 控制台将批量记录导入数据集，请创建一个包含名称、IAM 服务角色和数据位置的数据集导入作业。

如果您刚刚在[创建架构和数据集](data-prep-creating-datasets.md)中创建了数据集，请跳至步骤 5。

**导入批量记录（控制台）**

1. 在[https://console.aws.amazon.com/personalize/家](https://console.aws.amazon.com/personalize/home)中打开 Amazon Personalize 控制台并登录您的账户。

1.  在**数据集组**页面，选择您的数据集组。这时，将显示数据集组**概述**。

1. 在导航窗格中，选择**数据集**，然后选择要将批量数据导入到其中的数据集。

1. 在**数据集导入作业**中，选择**创建数据集导入作业**。

1. 如果这是第一个数据集导入作业，则对于**数据导入源**，请选择**从 S3 导入数据**。

1. 对于**数据集导入作业名称**，为导入作业指定名称。

1. 如果您已导入批量数据，则对于**导入模式**，请选择如何更新数据集。选择**替换现有数据**或**添加到现有数据**。如果这是第一个数据集作业，则不会显示此选项。有关更多信息，请参阅 [训练后更新数据集中的数据](updating-datasets.md)。

1. 在**数据导入源**中，对于**数据位置**，指定您的数据文件在 Amazon S3 中的存储位置。使用以下语法：

   **s3:/amzn-s3-demo-bucket/<folder path>/<CSV filename>**

   如果您的 CSV 文件位于 Amazon S3 存储桶的某个文件夹中，并且您想通过一个数据集导入作业将多个 CSV 文件上传到一个数据集，则可以指定该文件夹的路径。Amazon Personalize 仅使用您文件夹第一级中的文件，不使用任何子文件夹中的任何数据。使用以下语法，在文件夹名称后面加上 `/`：

   **s3:/amzn-s3-demo-bucket/<folder path>/**

1. 对于 **IAM 角色**，选择创建新角色或使用现有角色。如果您完成了先决条件，请选择**使用现有服务角色**，并指定您在[为 Amazon Personalize 创建 IAM 角色](set-up-required-permissions.md#set-up-create-role-with-permissions)中创建的角色。

1. 如果您创建了指标归因，并希望将与此作业相关的指标发布到 Amazon S3，请在**将事件指标发布到 S3** 中，选择**发布此导入作业的指标**。

   如果您尚未创建指标归因并想发布此作业的指标，请选择**创建指标归因**，以在其他选项卡上创建新的指标归因。创建指标归因后，您可以返回此屏幕，并完成导入作业的创建。

   有关指标归因的更多信息，请参阅[衡量 Amazon Personalize 推荐的影响](measuring-recommendation-impact.md)。

1. 对于**标签**，可以选择添加任何标签。有关标记 Amazon Personalize 资源的更多信息，请参阅[为 Amazon Personalize 资源添加标签](tagging-resources.md)。

1. 选择 **Start import (开始导入)**。数据导入作业开始，并显示**控制面板概览**页。当状态显示为 ACTIVE 时，数据集导入完成。将数据导入 Amazon Personalize 数据集后，您可以[分析数据](analyzing-data.md)、[将数据导出到 Amazon S3 存储桶](export-data.md)、[更新数据](updating-datasets.md)，或通过删除数据集[来删除数据](delete-dataset.md)。

    导入数据后，就可以创建域推荐器（适用于域数据集组）或自定义资源（适用于自定义数据集组），以根据您的数据训练模型。使用这些资源生成建议。有关更多信息，请参阅 [Amazon Personalize 中的域推荐器](creating-recommenders.md)或 [用于训练和部署 Amazon Personalize 模型的自定义资源](create-custom-resources.md)。

## 创建数据集导入作业（AWS CLI）
<a name="bulk-data-import-cli"></a>

**重要**  
默认情况下，数据集导入作业会替换您批量导入的数据集中的任何现有数据。如果您已经导入了批量数据，则可以通过更改作业的[导入模式](#bulk-import-modes)来追加数据。

 要使用导入批量记录 AWS CLI，请使用[CreateDatasetImportJob](API_CreateDatasetImportJob.md)命令创建数据集导入任务。如果您之前已经为数据集创建了数据集导入作业，则可以使用导入模式参数来指定如何添加新数据。有关更新现有批量数据的更多信息，请参阅[训练后更新数据集中的数据](updating-datasets.md)。

**导入批量记录 (AWS CLI)**

1. 通过运行以下命令来创建数据集导入作业。为您的数据集提供 Amazon 资源名称 (ARN)，并指定存储训练数据的 Amazon S3 存储桶的路径。为该路径使用以下语法：

   **s3:/amzn-s3-demo-bucket/<folder path>/<CSV filename>**

   如果您的 CSV 文件位于 Amazon S3 存储桶的某个文件夹中，并且您想通过一个数据集导入作业将多个 CSV 文件上传到一个数据集，则可以指定该文件夹的路径。Amazon Personalize 仅使用您文件夹第一级中的文件，不使用任何子文件夹中的任何数据。使用以下语法，在文件夹名称后面加上 `/`：

   **s3:/amzn-s3-demo-bucket/<folder path>/**

   提供您在中创建的 AWS Identity and Access Management (IAM) 角色亚马逊资源名称 (ARN)。[为 Amazon Personalize 创建 IAM 角色](set-up-required-permissions.md#set-up-create-role-with-permissions)默认 `import-mode` 为 `FULL`。有关更多信息，请参阅 [训练后更新数据集中的数据](updating-datasets.md)。有关操作的更多信息，请参阅[CreateDatasetImportJob](API_CreateDatasetImportJob.md)。

   ```
   aws personalize create-dataset-import-job \
   --job-name dataset import job name \
   --dataset-arn dataset arn \
   --data-source dataLocation=s3://amzn-s3-demo-bucket/filename \
   --role-arn roleArn \
   --import-mode FULL
   ```

   数据集导入作业 ARN 将显示，如以下示例所示。

   ```
   {
     "datasetImportJobArn": "arn:aws:personalize:us-west-2:acct-id:dataset-import-job/DatasetImportJobName"
   }
   ```

1. 通过使用 `describe-dataset-import-job` 命令来检查状态。提供上一个步骤中返回的数据集导入作业 ARN。有关操作的更多信息，请参阅[DescribeDatasetImportJob](API_DescribeDatasetImportJob.md)。

   ```
   aws personalize describe-dataset-import-job \
   --dataset-import-job-arn dataset import job arn
   ```

   这将显示数据集导入作业的属性，包括其状态。最初，`status` 显示为 CREATE PENDING。

   ```
   {
     "datasetImportJob": {
         "jobName": "Dataset Import job name",
         "datasetImportJobArn": "arn:aws:personalize:us-west-2:acct-id:dataset-import-job/DatasetImportJobArn",
         "datasetArn": "arn:aws:personalize:us-west-2:acct-id:dataset/DatasetGroupName/INTERACTIONS",
         "dataSource": {
             "dataLocation": "s3://amzn-s3-demo-bucket/ratings.csv"
         },
         "importMode": "FULL",
         "roleArn": "role-arn",
         "status": "CREATE PENDING",
         "creationDateTime": 1542392161.837,
         "lastUpdatedDateTime": 1542393013.377
     }
   }
   ```

   当状态显示为 ACTIVE 时，数据集导入完成。将数据导入 Amazon Personalize 数据集后，您可以[分析数据](analyzing-data.md)、[将数据导出到 Amazon S3 存储桶](export-data.md)、[更新数据](updating-datasets.md)，或通过删除数据集[来删除数据](delete-dataset.md)。

    导入数据后，就可以创建域推荐器（适用于域数据集组）或自定义资源（适用于自定义数据集组），以根据您的数据训练模型。使用这些资源生成建议。有关更多信息，请参阅 [Amazon Personalize 中的域推荐器](creating-recommenders.md)或 [用于训练和部署 Amazon Personalize 模型的自定义资源](create-custom-resources.md)。

## 创建数据集导入作业（AWS SDKs）
<a name="python-import-ex"></a>

**重要**  
默认情况下，数据集导入作业会替换您批量导入的数据集中的任何现有数据。如果您已经导入了批量数据，则可以通过更改作业的[导入模式](#bulk-import-modes)来追加数据。

要导入数据，请通过 [CreateDatasetImportJob](API_CreateDatasetImportJob.md) 操作创建数据集导入作业。以下代码展示了如何创建数据集导入作业。

提供作业名称，将 `datasetArn` 设置为数据集的 Amazon 资源名称 (ARN)，并将 `dataLocation` 设置为存储训练数据的 Amazon S3 存储桶的路径。为该路径使用以下语法：

**s3:/amzn-s3-demo-bucket/<folder path>/<CSV filename>.csv**

如果您的 CSV 文件位于 Amazon S3 存储桶的某个文件夹中，并且您想通过一个数据集导入作业将多个 CSV 文件上传到一个数据集，则可以指定该文件夹的路径。Amazon Personalize 仅使用您文件夹第一级中的文件，不使用任何子文件夹中的任何数据。使用以下语法，在文件夹名称后面加上 `/`：

**s3:/amzn-s3-demo-bucket/<folder path>/**

对于`roleArn`，请指定授予 Amazon Personalize 访问您的 S3 存储桶权限的 AWS Identity and Access Management (IAM) 角色。请参阅[为 Amazon Personalize 创建 IAM 角色](set-up-required-permissions.md#set-up-create-role-with-permissions)。默认 `importMode` 为 `FULL`。这将替换数据集中的所有批量数据。要追加数据，请将其设置为 `INCREMENTAL`。有关更新现有批量数据的更多信息，请参阅[训练后更新数据集中的数据](updating-datasets.md)。

------
#### [ SDK for Python (Boto3) ]

```
import boto3

personalize = boto3.client('personalize')

response = personalize.create_dataset_import_job(
    jobName = 'YourImportJob',
    datasetArn = 'dataset_arn',
    dataSource = {'dataLocation':'s3://amzn-s3-demo-bucket/filename.csv'},
    roleArn = 'role_arn',
    importMode = 'FULL'
)

dsij_arn = response['datasetImportJobArn']

print ('Dataset Import Job arn: ' + dsij_arn)

description = personalize.describe_dataset_import_job(
    datasetImportJobArn = dsij_arn)['datasetImportJob']

print('Name: ' + description['jobName'])
print('ARN: ' + description['datasetImportJobArn'])
print('Status: ' + description['status'])
```

------
#### [ SDK for Java 2.x ]

```
public static String createPersonalizeDatasetImportJob(PersonalizeClient personalizeClient,
                                                      String jobName,
                                                      String datasetArn,
                                                      String s3BucketPath,
                                                      String roleArn,
                                                      ImportMode importMode) {

  long waitInMilliseconds = 60 * 1000;
  String status;
  String datasetImportJobArn;
  
  try {
      DataSource importDataSource = DataSource.builder()
              .dataLocation(s3BucketPath)
              .build();
      
      CreateDatasetImportJobRequest createDatasetImportJobRequest = CreateDatasetImportJobRequest.builder()
              .datasetArn(datasetArn)
              .dataSource(importDataSource)
              .jobName(jobName)
              .roleArn(roleArn)
              .importMode(importMode)
              .build();
  
      datasetImportJobArn = personalizeClient.createDatasetImportJob(createDatasetImportJobRequest)
              .datasetImportJobArn();
      
      DescribeDatasetImportJobRequest describeDatasetImportJobRequest = DescribeDatasetImportJobRequest.builder()
              .datasetImportJobArn(datasetImportJobArn)
              .build();
  
      long maxTime = Instant.now().getEpochSecond() + 3 * 60 * 60;
  
      while (Instant.now().getEpochSecond() < maxTime) {
  
          DatasetImportJob datasetImportJob = personalizeClient
                  .describeDatasetImportJob(describeDatasetImportJobRequest)
                  .datasetImportJob();
  
          status = datasetImportJob.status();
          System.out.println("Dataset import job status: " + status);
  
          if (status.equals("ACTIVE") || status.equals("CREATE FAILED")) {
              break;
          }
          try {
              Thread.sleep(waitInMilliseconds);
          } catch (InterruptedException e) {
              System.out.println(e.getMessage());
          }
      }
      return datasetImportJobArn;
  
  } catch (PersonalizeException e) {
      System.out.println(e.awsErrorDetails().errorMessage());
  }
  return "";
}
```

------
#### [ SDK for JavaScript v3 ]

```
// Get service clients and commands using ES6 syntax.
import { CreateDatasetImportJobCommand, PersonalizeClient } from
  "@aws-sdk/client-personalize";

// create personalizeClient
const personalizeClient = new PersonalizeClient({
  region: "REGION"
});

// Set the dataset import job parameters.
export const datasetImportJobParam = {
  datasetArn: 'DATASET_ARN', /* required */
  dataSource: {  
    dataLocation: 's3://amzn-s3-demo-bucket/<folderName>/<CSVfilename>.csv'  /* required */
  },
  jobName: 'NAME',           /* required */
  roleArn: 'ROLE_ARN',       /* required */
  importMode: "FULL"         /* optional, default is FULL */
};

export const run = async () => {
  try {
    const response = await personalizeClient.send(new CreateDatasetImportJobCommand(datasetImportJobParam));
    console.log("Success", response);
    return response; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

------

来自 [DescribeDatasetImportJob](API_DescribeDatasetImportJob.md) 操作的响应包含操作的状态。

您必须等待，直到状态更改为 ACTIVE，然后才能使用数据训练模型。

当状态显示为 ACTIVE 时，数据集导入完成。将数据导入 Amazon Personalize 数据集后，您可以[分析数据](analyzing-data.md)、[将数据导出到 Amazon S3 存储桶](export-data.md)、[更新数据](updating-datasets.md)，或通过删除数据集[来删除数据](delete-dataset.md)。

 导入数据后，就可以创建域推荐器（适用于域数据集组）或自定义资源（适用于自定义数据集组），以根据您的数据训练模型。使用这些资源生成建议。有关更多信息，请参阅 [Amazon Personalize 中的域推荐器](creating-recommenders.md)或 [用于训练和部署 Amazon Personalize 模型的自定义资源](create-custom-resources.md)。