

# DynamoDB と Amazon S3 間でのデータのコピー
<a name="EMRforDynamoDB.CopyingData.S3"></a>

DynamoDB テーブルにあるデータは、Hive を使用して Amazon S3 バケットにコピーすることができます。

この操作は、DynamoDB テーブルにデータのアーカイブを作成したい場合などに行います。例えば、DynamoDB にテストデータのベースラインセットが置かれており、テスト環境でそれを操作する必要があるとします。このベースラインデータは、Amazon S3 バケットにコピーした上で、必要なテストを実行できます。その後、Amazon S3 バケットから DynamoDB にベースラインデータを復元することで、テスト環境をリセットすることができます。

[チュートリアル:Amazon DynamoDB と Apache Hive の使用](EMRforDynamoDB.Tutorial.md) の作業を行った場合、Amazon EMR ログを保存する Amazon S3 バケットが、既に作成されています。バケットのルートパスがわかっている場合は、このセクションの例のために、このバケットを利用できます。

1. Amazon EMR コンソール ([https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/)) を開きます。

1. **[Name]** (名前) で、クラスターを選択します。

1. URI が、**[Configuration Details]** (設定の詳細) の **[Log URI]** (ログの URI) に一覧表示されています。

1. バケットのルートパスを書き留めておきます。この命名規則は以下のとおりです。

   `s3://aws-logs-{{accountID}}-{{region}}`

   {{accountID}} は、使用している AWS アカウント ID であり、region は、バケットが置かれた AWS リージョンです。

**注記**  
これらの例では、ここに示すようなバケット内のサブパスを使用します。  
 `s3://aws-logs-123456789012-us-west-2/hive-test`

以下の手順は、チュートリアルの手順が正しく行われたこと、および、ddb\_features という名前の外部テーブルが DynamoDB 内に存在することを前提として書かれています。

**Topics**
+ [Hive のデフォルト形式を使用したデータのコピー](#EMRforDynamoDB.CopyingData.S3.DefaultFormat)
+ [ユーザー指定の形式でデータをコピー](#EMRforDynamoDB.CopyingData.S3.UserSpecifiedFormat)
+ [列マッピングを使用しないデータをコピー](#EMRforDynamoDB.CopyingData.S3.NoColumnMapping)
+ [Amazon S3 内のデータを表示](#EMRforDynamoDB.CopyingData.S3.ViewingData)

## Hive のデフォルト形式を使用したデータのコピー
<a name="EMRforDynamoDB.CopyingData.S3.DefaultFormat"></a>

**Example 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** と表示されています。

**Example 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';
   ```

1. データを DynamoDB にコピーします。

   ```
   INSERT OVERWRITE TABLE ddb_features
   SELECT * FROM s3_features_unformatted;
   ```

## ユーザー指定の形式でデータをコピー
<a name="EMRforDynamoDB.CopyingData.S3.UserSpecifiedFormat"></a>

フィールド区切りに独自の文字を指定する場合は、Amazon S3 バケットにマッピングされる外部テーブルを作成します。この手法は、カンマ区切り値 (CSV) のデータファイルを作成する場合などに使用できます。

**Example 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';
   ```

1. 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
```

**Example Amazon S3 から DynamoDB へのコピー**  
単一の HiveQL ステートメントにより、DynamoDB テーブルに Amazon S3 からのデータを書き込むことができます。  

```
INSERT OVERWRITE TABLE ddb_features
SELECT * FROM s3_features_csv;
```

## 列マッピングを使用しないデータをコピー
<a name="EMRforDynamoDB.CopyingData.S3.NoColumnMapping"></a>

DynamoDB からのデータは、データ型や列マッピングを指定せずにそのままの形式でコピーし、Amazon S3 に書き込むことができます。この手法は、DynamoDB データのアーカイブを作成して Amazon S3 に保存する場合などに使用します。



**Example 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");
   ```

   

1. 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';
   ```

1. 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** として表示されます。

**Example Amazon S3 から DynamoDB へのコピー**  
単一の HiveQL ステートメントにより、DynamoDB テーブルに Amazon S3 からのデータを書き込むことができます。  

```
INSERT OVERWRITE TABLE ddb_features_no_mapping
SELECT * FROM s3_features_no_mapping;
```

## Amazon S3 内のデータを表示
<a name="EMRforDynamoDB.CopyingData.S3.ViewingData"></a>

SSH を使用してリーダーノードに接続している場合には、AWS Command Line Interface (AWS CLI) を使用して、Hive が Amazon S3 に書き込んだデータにアクセスできます。

以下のステップは、このセクションで示された手順のいずれかを使用して、データが DynamoDB から Amazon S3 にコピーされていることを前提として記述されています。

1. 現在 Hive コマンドプロンプトが表示されている場合は、それを終了し、Linux コマンドプロンプトを表示します。

   ```
   hive> exit;
   ```

1. 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) は、システムにより生成されています。

1. (オプション) 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`
**注記**  
リーダーノードのローカルファイルシステムには、容量に関する制限があります。ローカルファイルシステム内で使用可能な領域より大きいサイズのファイルに対しては、このコマンドを使用しないでください。