Amazon DynamoDB
开发人员指南 (API 版本 2012-08-10)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

在 DynamoDB 与 Amazon S3 之间复制数据

如果您的 DynamoDB 表中包含数据,您可以使用 Hive 将数据复制到 Amazon S3 存储桶。

如果您想为 DynamoDB 中的数据创建存档,则可以这样做。例如,假设您有一个测试环境,需要使用 DynamoDB 中的一组基准测试数据。您可以将基准数据复制到 Amazon S3 存储桶,然后运行测试。之后,您可以将基准数据从 Amazon S3 存储桶还原到 DynamoDB,从而重置测试环境。

如果您完成了 教程:使用 Amazon DynamoDB 和 Apache Hive,则您已经拥有包含 Amazon EMR 日志的 Amazon S3 存储桶。如果您知道存储桶的根路径,您可以将此存储桶用于本部分的示例:

  1. 通过以下网址打开 Amazon EMR 控制台:https://console.amazonaws.cn/elasticmapreduce/

  2. 对于 Name,选择您的集群。

  3. URI 列于 Configuration Details 下的 Log URI 中。

  4. 记下存储桶的根路径。命名约定为:

    s3://aws-logs-accountID-region

    其中 accountID 是您的 AWS 账户 ID,“region”是存储桶的 AWS 区域。

注意

对于这些示例,我们将使用存储桶中的子路径,如下例所示:

s3://aws-logs-123456789012-us-west-2/hive-test

以下程序假设您已按照教程中的步骤操作并且具有在 DynamoDB 中控制的外部表 (ddb_features)。

使用 Hive 的默认格式复制数据

例 从 DynamoDB 到 Amazon S3

使用 INSERT OVERWRITE 语句直接写入 Amazon S3。

INSERT OVERWRITE DIRECTORY 's3://aws-logs-123456789012-us-west-2/hive-test' SELECT * FROM ddb_features;

Amazon S3 中的数据文件如下所示:

920709^ASoldiers Farewell Hill^ASummit^ANM^A32.3564729^A-108.33004616135 1178153^AJones Run^AStream^APA^A41.2120086^A-79.25920781260 253838^ASentinel Dome^ASummit^ACA^A37.7229821^A-119.584338133 264054^ANeversweet Gulch^AValley^ACA^A41.6565269^A-122.83614322900 115905^AChacaloochee Bay^ABay^AAL^A30.6979676^A-87.97388530

每个字段用 SOH 字符分隔 (标题以 0x01 开头)。在文件中,SOH 显示为 ^A

例 从 Amazon S3 到 DynamoDB

  1. 创建指向 Amazon S3 中的非格式化数据的外部表。

    CREATE EXTERNAL TABLE s3_features_unformatted (feature_id BIGINT, feature_name STRING , feature_class STRING , state_alpha STRING, prim_lat_dec DOUBLE , prim_long_dec DOUBLE , elev_in_ft BIGINT) LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';
  2. 将数据复制到 DynamoDB。

    INSERT OVERWRITE TABLE ddb_features SELECT * FROM s3_features_unformatted;

使用用户指定的格式复制数据

如果您想指定您自己的字段分隔符字符,您可以创建一个映射到 Amazon S3 存储桶的外部表。您可以使用此技术创建逗号分隔值 (CSV) 格式的数据文件。

例 从 DynamoDB 到 Amazon S3

  1. 创建一个映射到 Amazon S3 的 Hive 外部表。当您执行此操作时,请确保数据类型与 DynamoDB 外部表的数据类型一致。

    CREATE EXTERNAL TABLE s3_features_csv (feature_id BIGINT, feature_name STRING, feature_class STRING, state_alpha STRING, prim_lat_dec DOUBLE, prim_long_dec DOUBLE, elev_in_ft BIGINT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';
  2. 从 DynamoDB 复制数据。

    INSERT OVERWRITE TABLE s3_features_csv SELECT * FROM ddb_features;

Amazon S3 中的数据文件如下所示:

920709,Soldiers Farewell Hill,Summit,NM,32.3564729,-108.3300461,6135 1178153,Jones Run,Stream,PA,41.2120086,-79.2592078,1260 253838,Sentinel Dome,Summit,CA,37.7229821,-119.58433,8133 264054,Neversweet Gulch,Valley,CA,41.6565269,-122.8361432,2900 115905,Chacaloochee Bay,Bay,AL,30.6979676,-87.9738853,0

例 从 Amazon S3 到 DynamoDB

您可以通过一个 HiveQL 语句,使用 Amazon S3 中的数据填充 DynamoDB 表:

INSERT OVERWRITE TABLE ddb_features SELECT * FROM s3_features_csv;

复制数据而不指定列映射

您可以从 DynamoDB 复制原始格式的数据,并将其写入到 Amazon S3,而不指定任何数据类型或列映射。您可以使用此方法创建 DynamoDB 数据的存档,并将其存储在 Amazon S3 中。

注意

如果 DynamoDB 表包含映射、列表、布尔值或 Null 类型的属性,则这是您可以使用 Hive 将数据从 DynamoDB 复制到 Amazon S3 中的唯一方式。

例 从 DynamoDB 到 Amazon S3

  1. 创建一个与您的 DynamoDB 表关联的外部表。(此 HiveQL 语句中不包含 dynamodb.column.mapping。)

    CREATE EXTERNAL TABLE ddb_features_no_mapping (item MAP<STRING, STRING>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Features");
  2. 创建另一个与 Amazon S3 存储桶关联的外部表。

    CREATE EXTERNAL TABLE s3_features_no_mapping (item MAP<STRING, STRING>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://aws-logs-123456789012-us-west-2/hive-test';
  3. 将数据从 DynamoDB 复制到 Amazon S3。

    INSERT OVERWRITE TABLE s3_features_no_mapping SELECT * FROM ddb_features_no_mapping;

Amazon S3 中的数据文件如下所示:

Name^C{"s":"Soldiers Farewell Hill"}^BState^C{"s":"NM"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"6135"}^BLatitude^C{"n":"32.3564729"}^BId^C{"n":"920709"}^BLongitude^C{"n":"-108.3300461"} Name^C{"s":"Jones Run"}^BState^C{"s":"PA"}^BClass^C{"s":"Stream"}^BElevation^C{"n":"1260"}^BLatitude^C{"n":"41.2120086"}^BId^C{"n":"1178153"}^BLongitude^C{"n":"-79.2592078"} Name^C{"s":"Sentinel Dome"}^BState^C{"s":"CA"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"8133"}^BLatitude^C{"n":"37.7229821"}^BId^C{"n":"253838"}^BLongitude^C{"n":"-119.58433"} Name^C{"s":"Neversweet Gulch"}^BState^C{"s":"CA"}^BClass^C{"s":"Valley"}^BElevation^C{"n":"2900"}^BLatitude^C{"n":"41.6565269"}^BId^C{"n":"264054"}^BLongitude^C{"n":"-122.8361432"} Name^C{"s":"Chacaloochee Bay"}^BState^C{"s":"AL"}^BClass^C{"s":"Bay"}^BElevation^C{"n":"0"}^BLatitude^C{"n":"30.6979676"}^BId^C{"n":"115905"}^BLongitude^C{"n":"-87.9738853"}

每个字段以 STX 字符开头 (文本以 0x02 开头),并以 ETX 字符结尾 (文本以 0x03 结尾)。在文件中,STX 显示为 ^B,ETX 显示为 ^C

例 从 Amazon S3 到 DynamoDB

您可以通过一个 HiveQL 语句,使用 Amazon S3 中的数据填充 DynamoDB 表:

INSERT OVERWRITE TABLE ddb_features_no_mapping SELECT * FROM s3_features_no_mapping;

查看 Amazon S3 中的数据

如果使用 SSH 连接到主节点,您可以使用 AWS Command Line Interface (AWS CLI) 访问 Hive 写入到 Amazon S3 中的数据。

以下步骤假设您已使用本部分中的一种程序将数据从 DynamoDB 复制到 Amazon S3。

  1. 如果您当前处于 Hive 命令提示符下,请退出至 Linux 命令提示符。

    hive> exit;
  2. 列出 Amazon S3 存储桶中 hive-test 目录的内容。(这是 Hive 从 DynamoDB 复制数据的位置。)

    aws s3 ls s3://aws-logs-123456789012-us-west-2/hive-test/

    响应应与以下示例类似:

    2016-11-01 23:19:54 81983 000000_0

    文件名 (000000_0) 是系统生成的。

  3. (可选) 您可以将此数据文件从 Amazon S3 复制到主节点上的本地文件系统。完成此操作后,您可以使用标准 Linux 命令行实用工具处理文件中的数据。

    aws s3 cp s3://aws-logs-123456789012-us-west-2/hive-test/000000_0 .

    响应应与以下示例类似:

    download: s3://aws-logs-123456789012-us-west-2/hive-test/000000_0 to ./000000_0

    注意

    主节点上的本地文件系统容量有限。请勿使用此命令处理超过本地文件系统可用空间的文件。