Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

在 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。

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

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

Copy
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 中的非格式化数据的外部表。

    Copy
    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。

    Copy
    INSERT OVERWRITE TABLE ddb_features SELECT * FROM s3_features_unformatted;

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

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

从 DynamoDB 到 Amazon S3

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

    Copy
    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 复制数据。

    Copy
    INSERT OVERWRITE TABLE s3_features_csv SELECT * FROM ddb_features;

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

Copy
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 表:

Copy
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。)

    Copy
    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 存储桶关联的外部表。

    Copy
    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。

    Copy
    INSERT OVERWRITE TABLE s3_features_no_mapping SELECT * FROM ddb_features_no_mapping;

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

Copy
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 表:

Copy
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 命令提示符。

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

    Copy
    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 命令行实用工具处理文件中的数据。

    Copy
    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

    注意

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