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

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

导出数据集

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

您可以选择仅导出批量导入的数据(使用 Amazon Personalize 数据集导入任务导入),只导出您以增量方式导入的数据(使用控制台导入的历史记录和实时记录或PutEventsPutUsers,或者PutItems操作),或两者兼而有。

Amazon Personalize 化组合了完全匹配的重复适用于所有领域变成一条记录。如果两条记录具有相同的 ID,Amazon Personalize 化将根据您选择导出的数据包含或删除重复项:

  • 如果您同时导出批量数据和增量数据,Amazon Personalize 会根据用户的 ID 删除重复的商品或用户,只保留最新的商品或用户。对于交互数据集,Amazon Personalize 包括所有交互数据,而不管时间戳如

  • 如果您仅导出增量数据,Amazon Personalize 将包括您以增量方式导入的所有商品、用户或互动数据,包括商品或具有相同 ID 的用户。仅排除与所有字段完全匹配的记录。

  • 如果您仅导出批量数据,Amazon Personalize 化将包括您批量导入的所有商品、用户或互动数据,包括商品或具有相同 ID 的用户。仅排除与所有字段完全匹配的记录。

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

您可以使用 Amazon Personalize 控制台创建数据集导出作业,Amazon Command Line Interface(Amazon CLI),或者Amazon开发工具包。

数据集导出作业权限要求

要导出数据集,Amazon Personalize 的权限需要向 Amazon S3 存储桶添加文件的权限。要授予权限,请附加一个新的Amazon Identity and Access Management针对您的 Amazon Personalize 服务相关角色的 (IAM) 策略,该策略授予该角色使用PutObjectListBucket对存储桶执行操作,并将存储桶策略附加到输出 Amazon S3 存储桶,该策略授予 Amazon Personalize 原则权限以使用PutObjectListBucket行动。

Amazon S3 存储桶和对象必须免费加密,或者如果您正在使用Amazon Key Management Service(Amazon KMS) 对于加密,您必须授予 IAM 用户和 Amazon Personalize 服务角色使用密钥的权限。您还必须将 Amazon Personalize 化作为原则添加到您的Amazon KMS密钥策略。有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的使用 Amazon KMS 中的密钥策略

如果您的域数据集组或自定义数据集组使用Amazon KMS用于加密的密钥、IAM 用户和Amazon KMS必须授予关键策略GenerateDataKeyWithoutPlaintextDecrypt权限。

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

以下示例策略授予您的 Amazon Personalize 化服务相关角色使用PutObjectListBucket行动。Replacebucket-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 使用PutObjectListBucket针对 Amazon S3 存储桶采取的操作。将 bucket-name 替换为您的存储桶的名称。有关向存储桶添加 Amazon S3 存储桶策略的信息,请参阅如何添加 S3 存储桶策略?中的Amazon Simple Storage Service 用户指南。

{ "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. In数据集导出作业,选择创建数据集导出作业.

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

  8. 适用于IAM 服务角色中,选择您在中创建的 Amazon Personalize 化服务相关角色创建 Amazon Personalize 的 IAM 角色.

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

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

  10. 如果您在使用Amazon KMS对于加密,用于KMS 密钥 ARN中,输入 Amazon 资源名称 (ARN)Amazon KMS键。

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

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

    • 选择递增仅导出使用控制台或进行增量导入的数据PutEventsPutUsers,或者PutItems运算。

    • 选择二者以导出数据集中的所有数据。

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

    在存储库的数据集概述在页面中数据集导出作业,该作业列出了导出任务状态. 当状态为时,数据集导出作业完成。活跃. 然后,您可以从输出 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 服务相关角色的 ARN创建 Amazon Personalize 的 IAM 角色. Ins3DataDestination,对于kmsKeyArn,可以选择 ARN 您的Amazon KMS关键,以及path提供输出 Amazon S3 存储桶的路径。

适用于ingestion-mode中,指定要从以下选项中导出的数据:

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

  • 指定PUT仅导出使用控制台或进行增量导入的数据PutEvents、PutUser,或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开发工具包)

将数据导入数据集并创建输出 Amazon S3 存储桶后,您可以将数据集导出到存储桶进行分析。使用导出数据集Amazon开发工具包,使用创建数据集导出作业CreateDatasetExportJoboperation. 有关创建 Amazon S3 存储桶的信息,请参阅创建存储桶中的Amazon Simple Storage Service 用户指南.

以下代码演示了如何使用 SDK for Python (Boto3) 或适用于 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 服务相关角色的 ARN创建 Amazon Personalize 的 IAM 角色. Ins3DataDestination,对于kmsKeyArn,可以选择 ARN 您的Amazon KMS关键,以及path提供输出 Amazon S3 存储桶的路径。

适用于ingestionMode中,指定要从以下选项中导出的数据:

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

  • 指定PUT仅导出使用控制台或进行增量导入的数据PutEvents、PutUser,或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创建数据集导出作业的方法。将以下内容作为参数传递:个人化客户端、导出任务的名称、要导出的数据集的 ARN、摄取模式、输出 Amazon S3 存储桶的路径以及您的 ARNAmazon KMS键。

这些区域有:ingestionMode可以是以下选项之一:

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

  • 使用IngestionMode.PUT仅导出使用控制台或进行增量导入的数据PutEvents、PutUser,或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()); } }