本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 DynamoDB 與 Amazon S3 之間複製資料
如果 DynamoDB 資料表中有資料,則可以使用 Hive 將資料複製到 Amazon S3 儲存貯體。
如果您想要在 DynamoDB 資料表中建立資料的封存,則可執行此操作。例如,假設您的測試環境需要在 DynamoDB 中使用一組基準測試資料。您可以將基準資料複製到 Amazon S3 儲存貯體,然後執行測試。之後,您可以將 Amazon S3 儲存貯體中的基準資料還原到 DynamoDB,以此重設測試環境。
如果透過 教學課程:使用 Amazon DynamoDB 和 Apache Hive 作業,則表示您已經擁有一個包含 Amazon EMR 記錄的 Amazon S3 儲存貯體。如果您知道儲存貯體的根路徑,則可以將此儲存貯體用於本節中的範例:
在以下位置打開 Amazon EMR 控制台 https://console.aws.amazon.com/emr
。 -
對於 Name (名稱),選擇您的叢集。
-
URI 會列在 Configuration Details (組態詳細資訊) 下方的 Log URI (記錄 URI)。
-
記下儲存貯體的根路徑。命名慣例是:
s3://aws-logs-
accountID
-region
其中
account
ID 是您的 AWS 帳戶 ID,而地區是值 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
^A
Soldiers Farewell Hill^A
Summit^A
NM^A
32.3564729^A
-108.33004616135 1178153^A
Jones Run^A
Stream^A
PA^A
41.2120086^A
-79.25920781260 253838^A
Sentinel Dome^A
Summit^A
CA^A
37.7229821^A
-119.584338133 264054^A
Neversweet Gulch^A
Valley^A
CA^A
41.6565269^A
-122.83614322900 115905^A
Chacaloochee Bay^A
Bay^A
AL^A
30.6979676^A
-87.97388530
每個欄位都以 SOH 字元分隔 (標題的開頭,0x01)。在檔案中,SOH 會顯示為 ^A
。
範例 從 Amazon S3 到 DynamoDB
-
建立一個指向 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';
-
將資料複製到 DynamoDB。
INSERT OVERWRITE TABLE ddb_features SELECT * FROM s3_features_unformatted;
以使用者指定格式複製資料
如果您想要指定自己的欄位分隔符號字元,則可建立映射至 Amazon S3 儲存貯體的外部資料表。您可以使用此技術建立具有逗號分隔值 (CSV) 的資料檔案。
範例 從 DynamoDB 到 Amazon S3
-
建立映射至 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';
-
從 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 到 Amazon S3
-
建立與 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");
-
建立另一個與 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';
-
將資料從 DynamoDB 複製到 Amazon S3。
INSERT OVERWRITE TABLE s3_features_no_mapping SELECT * FROM ddb_features_no_mapping;
Amazon S3 中的資料檔案如下所示:
Name
^C
{"s":"Soldiers Farewell Hill"}^B
State^C
{"s":"NM"}^B
Class^C
{"s":"Summit"}^B
Elevation^C
{"n":"6135"}^B
Latitude^C
{"n":"32.3564729"}^B
Id^C
{"n":"920709"}^B
Longitude^C
{"n":"-108.3300461"} Name^C
{"s":"Jones Run"}^B
State^C
{"s":"PA"}^B
Class^C
{"s":"Stream"}^B
Elevation^C
{"n":"1260"}^B
Latitude^C
{"n":"41.2120086"}^B
Id^C
{"n":"1178153"}^B
Longitude^C
{"n":"-79.2592078"} Name^C
{"s":"Sentinel Dome"}^B
State^C
{"s":"CA"}^B
Class^C
{"s":"Summit"}^B
Elevation^C
{"n":"8133"}^B
Latitude^C
{"n":"37.7229821"}^B
Id^C
{"n":"253838"}^B
Longitude^C
{"n":"-119.58433"} Name^C
{"s":"Neversweet Gulch"}^B
State^C
{"s":"CA"}^B
Class^C
{"s":"Valley"}^B
Elevation^C
{"n":"2900"}^B
Latitude^C
{"n":"41.6565269"}^B
Id^C
{"n":"264054"}^B
Longitude^C
{"n":"-122.8361432"} Name^C
{"s":"Chacaloochee Bay"}^B
State^C
{"s":"AL"}^B
Class^C
{"s":"Bay"}^B
Elevation^C
{"n":"0"}^B
Latitude^C
{"n":"30.6979676"}^B
Id^C
{"n":"115905"}^B
Longitude^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。
-
如果您目前處於 Hive 命令提示字元,請離開至 Linux 命令提示字元。
hive> exit;
-
列出 Amazon S3 儲存貯體中的 Hive 測試目錄內容。(這是 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) 是由系統產生的。
-
(選用) 您可以將資料檔案從 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
注意
領導節點上的本機檔案系統容量有限。請勿將此命令與大於本機檔案系統中可用空間的檔案搭配使用。