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
accountID
は、使用している AWS アカウント ID であり、region は、バケットが置かれた AWS リージョンです。
注記
これらの例では、ここに示すようなバケット内のサブパスを使用します。
s3://aws-logs-123456789012-us-west-2
/hive-test
以下の手順は、チュートリアルの手順が正しく行われたこと、および、ddb_features という名前の外部テーブルが DynamoDB 内に存在することを前提として書かれています。
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 ステートメントにより、DynamoDB テーブルに Amazon S3 からのデータを書き込むことができます。
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 ステートメントにより、DynamoDB テーブルに Amazon S3 からのデータを書き込むことができます。
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-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) は、システムにより生成されています。
-
(オプション) 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
注記
リーダーノードのローカルファイルシステムには、容量に関する制限があります。ローカルファイルシステム内で使用可能な領域より大きいサイズのファイルに対しては、このコマンドを使用しないでください。