导出数据集 - Amazon Personalize
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

导出数据集

注意

您无法导出操作交互数据集或操作数据集中的数据。

将数据导入 Amazon Personalize 数据集后,您可以将数据导出到 Amazon S3 存储桶。您可以导出数据,来验证和检查 Amazon Personalize 用来生成建议、实时查看您之前记录的物品交互事件或对数据进行离线分析的数据。

您可以选择仅导出批量导入的数据(使用 Amazon Personalize 数据集导入任务导入),也可以选择仅导出您单独导入的数据(使用控制台或者 PutEventsPutUsersPutItems 操作导入的记录),或者两者兼而有之。

对于与所有字段 完全匹配的记录,Amazon Personalize 仅导出一条记录。如果两条记录具有相同的 ID,但一个或多个字段不同,则 Amazon Personalize 会根据您选择导出的数据包含或删除记录:

  • 如果您同时导出批量数据和增量数据,则 Amazon Personalize 将仅导出具有相同 ID 的最新物品(在物品数据集导出中),并仅导出具有相同 ID 的用户(在用户数据集导出中)。对于物品交互数据集,Amazon Personalize 会导出所有物品交互数据。

  • 如果您仅导出增量数据,则 Amazon Personalize 会导出您单独导入的所有物品、用户或物品交互数据,包括具有相同 ID 的物品或用户。只有与所有字段完全匹配的记录才会被排除在外。

  • 如果您仅导出批量数据,则 Amazon Personalize 会包括您批量导入的所有物品、用户或物品交互数据,包括具有相同 ID 的物品或用户。只有与所有字段完全匹配的记录才会被排除在外。

要导出数据集,请创建数据集导出作业。数据集导出作业 是一种记录导出工具,可将数据集中的记录输出到 Amazon S3 存储桶中的一个或多个 CSV 文件。输出 CSV 文件包括标题行,其列名称与数据集架构中的字段相匹配。

您可以使用 Amazon Personalize 控制台、Amazon Command Line Interface (Amazon CLI) 或 Amazon SDK 创建数据集导出作业。

数据集导出作业权限要求

要导出数据集,Amazon Personalize 需要将文件添加到 Amazon S3 存储桶的权限。要授予权限,请将新的 Amazon Identity and Access Management (IAM) 策略附加到您的 Amazon Personalize 服务角色,该策略授予该角色对您的存储桶使用 PutObjectListBucket 操作的权限,并将存储桶策略附加到您的输出 Amazon S3 存储桶,该策略授予 Amazon Personalize 主体使用 PutObjectListBucket 操作的权限。

如果您使用 Amazon Key Management Service (Amazon KMS) 进行加密,则必须向 Amazon Personalize 和 Amazon Personalize IAM 服务角色授予使用您密钥的权限。有关更多信息,请参阅向 Amazon Personalize 授予使用您 Amazon KMS 密钥的权限

用于导出数据集的服务角色策略

以下示例策略授予您的 Amazon Personalize 服务角色使用 PutObjectListBucket 操作的权限。将 bucket-name 替换为输出存储桶的名称。有关将策略附加到 IAM 服务角色的信息,请参阅将 Amazon S3 策略附加到您的 Amazon Personalize 服务角色中

{ "Version": "2012-10-17", "Id": "PersonalizeS3BucketAccessPolicy", "Statement": [ { "Sid": "PersonalizeS3BucketAccessPolicy", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] } ] }

用于导出数据集的 Amazon S3 存储桶策略

以下示例策略授予 Amazon Personalize 针对 Amazon S3 存储桶使用 PutObjectListBucket 操作的权限。将 bucket-name替换为您的桶的名称。有关将 Amazon S3 存储桶策略添加到存储桶的信息,请参阅《Amazon Simple Storage Service 用户指南》中的如何添加 S3 存储桶策略?

{ "Version": "2012-10-17", "Id": "PersonalizeS3BucketAccessPolicy", "Statement": [ { "Sid": "PersonalizeS3BucketAccessPolicy", "Effect": "Allow", "Principal": { "Service": "personalize.amazonaws.com" }, "Action": [ "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] } ] }

创建数据集导出作业(控制台)

将数据导入数据集并创建输出 Amazon S3 存储桶后,您可以将数据导出到存储桶进行分析。要使用 Amazon Personalize 控制台导出数据集,您需要创建数据集导出作业。有关创建 Amazon S3 存储桶的信息,请参阅《Amazon Simple Storage Service 用户指南》中的创建存储桶

在导出数据集之前,确保您的 Amazon Personalize 服务角色可以访问和写入您的输出 Amazon S3 存储桶。请参阅数据集导出作业权限要求

创建数据集导出作业(控制台)
  1. 打开 Amazon Personalize 控制台(网址为 https://console.aws.amazon.com/personalize/home)。

  2. 在导航窗格中,选择数据集组

  3. 数据集组页面,选择您的数据集组。

  4. 在导航窗格中,选择数据集

  5. 选择要导出到 Amazon S3 存储桶的数据集。

  6. 数据集导出作业中,选择创建数据集导出作业

  7. 数据集导出作业详细信息中,对于数据集导出作业名称,输入导出作业的名称。

  8. 对于 IAM 服务角色,选择您在为 Amazon Personalize 创建 IAM 角色中创建的 Amazon Personalize 服务角色。

  9. 对于 Amazon S3 数据输出路径,输入目标 Amazon S3 存储桶。使用以下语法:

    s3://<name of your S3 bucket>/<folder path>

  10. 如果将 Amazon KMS 用于加密,则对于 KMS 密钥 ARN,输入 Amazon KMS 密钥的 Amazon 资源名称 (ARN)。

  11. 对于导出数据类型,根据您最初导入数据的方式,选择要导出的数据类型。

    • 选择批量,仅导出使用数据集导入作业批量导入的数据。

    • 选择增量,仅导出您使用控制台或者 PutEventsPutUsersPutItems 操作单独导入的数据。

    • 选择两者,导出数据集中的所有数据。

  12. 对于标签,可以选择添加任何标签。有关标记 Amazon Personalize 资源的更多信息,请参阅为 Amazon Personalize 资源添加标签

  13. 选择创建数据集导出作业

    数据集概述页面的数据集导出作业中,作业以导出作业状态列出。当状态为活动时,表示数据集导出作业完成。然后,您可以从输出 Amazon S3 存储桶中下载数据。有关从 Amazon S3 存储桶下载对象的信息,请参阅《Amazon Simple Storage Service 用户指南》中的下载对象

创建数据集导出作业 (Amazon CLI)

将数据导入数据集并创建输出 Amazon S3 存储桶后,您可以将数据集导出到存储桶进行分析。要使用 Amazon CLI 导出数据集,请使用 create-dataset-export-job Amazon CLI 命令创建数据集导出作业。有关创建 Amazon S3 存储桶的信息,请参阅《Amazon Simple Storage Service 用户指南》中的创建存储桶

在导出数据集之前,确保 Amazon Personalize 服务角色可以访问和写入您的输出 Amazon S3 存储桶。请参阅数据集导出作业权限要求

以下是 create-dataset-export-job Amazon CLI 命令的示例。为作业命名,将 dataset arn 替换为要导出的数据集的 Amazon 资源名称 (ARN),然后将 role ARN 替换为您在为 Amazon Personalize 创建 IAM 角色中创建的 Amazon Personalize 服务角色的 ARN。在 s3DataDestination 中,对于 kmsKeyArn,可以选择为您的 Amazon KMS 密钥提供 ARN,对于 path,提供输出 Amazon S3 存储桶的路径。

对于 ingestion-mode,通过以下选项指定要导出的数据:

  • 指定 BULK,仅导出使用数据集导入作业批量导入的数据。

  • 指定 PUT,仅导出您使用控制台或者 PutEvents、PutUsers 或 PutItems 操作单独导入的数据。

  • 指定 ALL,导出数据集中的所有数据。

有关更多信息,请参阅CreateDatasetExportJob

aws personalize create-dataset-export-job \ --job-name job name \ --dataset-arn dataset ARN \ --job-output "{\"s3DataDestination\":{\"kmsKeyArn\":\"kms key ARN\",\"path\":\"s3://bucket-name/folder-name/\"}}" \ --role-arn role ARN \ --ingestion-mode PUT

这时,将显示数据集导出作业 ARN。

{ "datasetExportJobArn": "arn:aws:personalize:us-west-2:acct-id:dataset-export-job/DatasetExportJobName" }

使用 DescribeDatasetExportJob 操作检查状态。

aws personalize describe-dataset-export-job \ --dataset-export-job-arn dataset export job ARN

创建数据集导出作业 (Amazon SDK)

将数据导入数据集并创建输出 Amazon S3 存储桶后,您可以将数据集导出到存储桶进行分析。要使用 Amazon SDK 导出数据集,请使用 CreateDatasetExportJob 操作创建数据集导出作业。有关创建 Amazon S3 存储桶的信息,请参阅《Amazon Simple Storage Service 用户指南》中的创建存储桶

以下代码演示了如何使用 SDK for Python (Boto3) 或 SDK for Java 2.x SDK 创建数据集导出作业。

在导出数据集之前,确保 Amazon Personalize 服务角色可以访问和写入您的输出 Amazon S3 存储桶。请参阅数据集导出作业权限要求

SDK for Python (Boto3)

使用以下 create_dataset_export_job,将数据集中的数据导出到 Amazon S3 存储桶。为作业命名,将 dataset arn 替换为要导出的数据集的 Amazon 资源名称 (ARN),然后将 role ARN 替换为您在为 Amazon Personalize 创建 IAM 角色中创建的 Amazon Personalize 服务角色的 ARN。在 s3DataDestination 中,对于 kmsKeyArn,可以选择为您的 Amazon KMS 密钥提供 ARN,对于 path,提供输出 Amazon S3 存储桶的路径。

对于 ingestionMode,通过以下选项指定要导出的数据:

  • 指定 BULK,仅导出使用数据集导入作业批量导入的数据。

  • 指定 PUT,仅导出您使用控制台或者 PutEvents、PutUsers 或 PutItems 操作单独导入的数据。

  • 指定 ALL,导出数据集中的所有数据。

import boto3 personalize = boto3.client('personalize') response = personalize.create_dataset_export_job( jobName = 'job name', datasetArn = 'dataset ARN', jobOutput = { "s3DataDestination": { "kmsKeyArn": "kms key ARN", "path": "s3://bucket-name/folder-name/" } }, roleArn = 'role ARN', ingestionMode = 'PUT' ) dsej_arn = response['datasetExportJobArn'] print ('Dataset Export Job arn: ' + dsej_arn) description = personalize.describe_dataset_export_job( datasetExportJobArn = dsej_arn)['datasetExportJob'] print('Name: ' + description['jobName']) print('ARN: ' + description['datasetExportJobArn']) print('Status: ' + description['status'])
SDK for Java 2.x

使用以下 createDatasetExportJob 方法创建数据集导出作业。将以下内容作为参数传递:PersonalizeClient、导出作业的名称、要导出的数据集的 ARN、摄取模式、输出 Amazon S3 存储桶的路径以及 Amazon KMS 密钥的 ARN。

ingestionMode 可以是以下一个选项:

  • 使用 IngestionMode.BULK,仅导出使用数据集导入作业批量导入的数据。

  • 使用 IngestionMode.PUT,仅导出您使用控制台或者 PutEvents、PutUsers 或 PutItems 操作单独导入的数据。

  • 使用 IngestionMode.ALL,导出数据集中的所有数据。

public static void createDatasetExportJob(PersonalizeClient personalizeClient, String jobName, String datasetArn, IngestionMode ingestionMode, String roleArn, String s3BucketPath, String kmsKeyArn) { long waitInMilliseconds = 30 * 1000; // 30 seconds String status = null; try { S3DataConfig exportS3DataConfig = S3DataConfig.builder() .path(s3BucketPath) .kmsKeyArn(kmsKeyArn) .build(); DatasetExportJobOutput jobOutput = DatasetExportJobOutput.builder() .s3DataDestination(exportS3DataConfig) .build(); CreateDatasetExportJobRequest createRequest = CreateDatasetExportJobRequest.builder() .jobName(jobName) .datasetArn(datasetArn) .ingestionMode(ingestionMode) .jobOutput(jobOutput) .roleArn(roleArn) .build(); String datasetExportJobArn = personalizeClient.createDatasetExportJob(createRequest).datasetExportJobArn(); DescribeDatasetExportJobRequest describeDatasetExportJobRequest = DescribeDatasetExportJobRequest.builder() .datasetExportJobArn(datasetExportJobArn) .build(); long maxTime = Instant.now().getEpochSecond() + 3 * 60 * 60; while (Instant.now().getEpochSecond() < maxTime) { DatasetExportJob datasetExportJob = personalizeClient.describeDatasetExportJob(describeDatasetExportJobRequest) .datasetExportJob(); status = datasetExportJob.status(); System.out.println("Export job status: " + status); if (status.equals("ACTIVE") || status.equals("CREATE FAILED")) { break; } try { Thread.sleep(waitInMilliseconds); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } } catch (PersonalizeException e) { System.out.println(e.awsErrorDetails().errorMessage()); } }