创建域数据集组并导入交互数据 (Amazon开发工具包) - Amazon Personalize
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

创建域数据集组并导入交互数据 (Amazon开发工具包)

创建域数据集组时,您可以选择域、创建架构和交互数据集,然后导入历史数据。如果您没有历史数据,可以选择以后以增量方式记录交互数据。

创建交互数据集时,您可以使用域的默认架构,也可以自定义该模式以创建自己的架构。架构允许 Amazon Personalize 化读取您的数据。使用字段及其类型作为指南,以确定要导入 Amazon Personalize 化的数据。有关默认架构的更多信息,请参阅域数据集和架构.

第 1 步:创建域数据集组

使用以下代码创建 Domain 数据集组。为域数据集组指定一个名称,然后domain,请指定ECOMMERCE要么VIDEO_ON_DEMAND.

SDK for Python (Boto3)
import boto3 personalize = boto3.client('personalize') response = personalize.create_dataset_group( name = 'dataset group name' domain = 'business domain' ) dsg_arn = response['datasetGroupArn'] description = personalize.describe_dataset_group(datasetGroupArn = dsg_arn)['datasetGroup'] print('Name: ' + description['name']) print('ARN: ' + description['datasetGroupArn']) print('Status: ' + description['status'])
SDK for Java 2.x
public static String createDomainDatasetGroup(PersonalizeClient personalizeClient, String datasetGroupName, String domain) { try { CreateDatasetGroupRequest createDatasetGroupRequest = CreateDatasetGroupRequest.builder() .name(datasetGroupName) .domain(domain) .build(); return personalizeClient.createDatasetGroup(createDatasetGroupRequest).datasetGroupArn(); } catch (PersonalizeException e) { System.out.println(e.awsErrorDetails().errorMessage()); } return ""; }

Amazon Personalize 将返回新域数据集组的 Amazon 资源名称 (ARN)。记录它,因为在创建数据集时会用到它。

第 2 步:创建架构和交互数据集

完成后,第 1 步:创建域数据集组中,创建架构和交互数据集以存储来自用户与目录中项目之间交互的数据。

创建架构和交互数据集

  1. 以 Avro 格式创建架构文件,然后将其保存为 JSON 文件在工作目录中。

    模式必须与数据中的列和架构匹配name必须是Interactions. 以下是 VIDEO_ON_DEMAND 域的默认交互模式。有关更多信息,请参阅 域数据集和架构

    { "type": "record", "name": "Interactions", "namespace": "com.amazonaws.personalize.schema", "fields": [ { "name": "USER_ID", "type": "string" }, { "name": "ITEM_ID", "type": "string" }, { "name": "EVENT_TYPE", "type": "string" }, { "name": "TIMESTAMP", "type": "long" } ], "version": "1.0" }
  2. 使用CreateSchemaAPI 操作。

    SDK for Python (Boto3)

    使用以下 SDK for Python (Boto3) 代码创建架构。为模式命名,替换schema.json使用模式 JSON 文件的文件路径,然后替换business domain或者VIDEO_ON_DEMAND要么ECOMMERCE.

    import boto3 personalize = boto3.client('personalize') with open('schema.json') as f: createSchemaResponse = personalize.create_schema( name = 'schema name', domain = 'business domain' schema = f.read() ) schema_arn = createSchemaResponse['schemaArn'] print('Schema ARN:' + schema_arn )
    SDK for Java 2.x

    使用以下命令createSchema创建域架构的方法。将以下内容作为参数传递:个人化客户端、架构的名称、您的业务域(电子商务或 VIDEO_ON_DEBUD)以及模式 JSON 文件的文件路径。

    public static String createDomainSchema(PersonalizeClient personalizeClient, String schemaName, String domain, String filePath) { String schema = null; try { schema = new String(Files.readAllBytes(Paths.get(filePath))); } catch (IOException e) { System.out.println(e.getMessage()); } try { CreateSchemaRequest createSchemaRequest = CreateSchemaRequest.builder() .name(schemaName) .domain(domain) .schema(schema) .build(); String schemaArn = personalizeClient.createSchema(createSchemaRequest).schemaArn(); System.out.println("Schema arn: " + schemaArn); return schemaArn; } catch (PersonalizeException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return ""; }

    Amazon Personalize 将返回新架构的 Amazon 资源名称 (ARN)。记录下来,因为您在下一个步骤中需要使用此值。

  3. 使用CreateDatasetoperation. 有关不同类型的域数据集的更多信息,请参阅域数据集和架构.

    使用以下代码创建一个交互数据集Amazon开发工具包。为数据集指定名称并指定datasetGroupArn返回第 1 步:创建域数据集组. 使用schemaArn在上一步中创建的。适用于datasetType具体说明Interactions.

    SDK for Python (Boto3)
    import boto3 personalize = boto3.client('personalize') response = personalize.create_dataset( name = 'datase_name', schemaArn = 'schema_arn', datasetGroupArn = 'dataset_group_arn', datasetType = 'dataset_type' ) print ('Dataset Arn: ' + response['datasetArn'])
    SDK for Java 2.x
    public static String createDataset(PersonalizeClient personalizeClient, String datasetName, String datasetGroupArn, String datasetType, String schemaArn) { try { CreateDatasetRequest request = CreateDatasetRequest.builder() .name(datasetName) .datasetGroupArn(datasetGroupArn) .datasetType(datasetType) .schemaArn(schemaArn).build(); String datasetArn = personalizeClient.createDataset(request).datasetArn(); System.out.println("Dataset " + datasetName + " created. Dataset ARN: " + datasetArn); return datasetArn; } catch(PersonalizeException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return ""; }

    Amazon Personalize 将返回新数据集的 Amazon 资源名称 (ARN)。请记录,因为在导入数据时会用到它。创建数据集后,您可以随时导入数据。请参阅 第 3 步:导入交互数据

第 3 步:导入交互数据

完成后,第 2 步:创建架构和交互数据集,你已准备好导入数据了。如果您在 Amazon S3 中有数据,请使用CreateDatasetImportJoboperation. 如果您只想以增量方式导入交互数据,可以跳过此步骤,而是使用PutEvents操作,直到您至少有 1000 个合并的历史和增量交互。有关更多信息,请参阅记录事件.

以下代码显示了如何使用数据集导入作业将批量数据导入到数据集中。

SDK for Python (Boto3)

指定datasetGroupArn然后设置dataLocation到存储训练数据的 Amazon S3 存储桶的路径。使用下面的语法:

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

对于roleArn中,指定Amazon Identity and Access Management(IAM) 角色,用于授予 Amazon Personalize 访问 Amazon S3 存储桶的权限。请参阅 创建 IAM 角色

import boto3 personalize = boto3.client('personalize') response = personalize.create_dataset_import_job( jobName = 'YourImportJob', datasetArn = 'dataset_arn', dataSource = {'dataLocation':'s3://bucket/file.csv'}, roleArn = 'role_arn' ) 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

使用以下命令createPersonalizeDatasetImportJob创建数据集导入作业的方法。将以下内容作为参数传递:Amazon Personalize 服务客户端、作业的名称、数据集的 Amazon 资源名称 (ARN)、Amazon S3 存储桶路径 (s3://<bucketname>/<file name.csv>) 您存储培训数据的位置以及您的 Amazon Personalize IAM 服务角色的 ARN(请参阅创建 IAM 角色)。

如果 CSV 文件位于 Amazon S3 存储桶的文件夹中,则可以在一个数据集导入任务中将多个 CSV 文件上传到数据集中。对于存储桶路径,请指定bucket-name/folder-name/而不是文件名。

public static String createPersonalizeDatasetImportJob(PersonalizeClient personalizeClient, String jobName, String datasetArn, String s3BucketPath, String roleArn) { 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) .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 ""; }

使用DescribeDatasetImportJob操作以检索操作的状态。您必须等待,直到状态更改为 ACTIVE,然后才能使用数据创建推荐者。