

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Kopieren von Daten zwischen DynamoDB und HDFS
<a name="EMRforDynamoDB.CopyingData.HDFS"></a>

Wenn Sie Daten in einer DynamoDB-Tabelle vorliegen haben, können Sie sie mit Hive in das Hadoop Distributed File System (HDFS) kopieren.

Sie können dies tun, wenn Sie einen MapReduce Job ausführen, für den Daten von DynamoDB erforderlich sind. Wenn Sie die Daten aus DynamoDB in HDFS kopieren, kann Hadoop sie verarbeiten, indem alle verfügbaren Knoten im Amazon EMR-Cluster parallel verwendet werden. Wenn der MapReduce Job abgeschlossen ist, können Sie die Ergebnisse von HDFS nach DDB schreiben.

In den folgenden Beispielen verwendet Hive das nachstehende HDFS-Verzeichnis für Lese- und Schreibvorgänge: `/user/hadoop/hive-test`

**Anmerkung**  
Die Beispiele in diesem Abschnitt setzen voraus, dass Sie die Schritte in [Tutorial: Arbeiten mit Amazon DynamoDB und Apache Hive](EMRforDynamoDB.Tutorial.md) befolgt haben und über eine externe Tabelle, die in DynamoDB verwaltet wird (*ddb\_features*), verfügen. 

**Topics**
+ [Kopieren von Daten mit dem Hive-Standardformat](#EMRforDynamoDB.CopyingData.HDFS.DefaultFormat)
+ [Kopieren von Daten in einem benutzerdefinierten Format](#EMRforDynamoDB.CopyingData.HDFS.UserSpecifiedFormat)
+ [Kopieren von Daten ohne Spaltenmapping](#EMRforDynamoDB.CopyingData.HDFS.NoColumnMapping)
+ [Zugriff auf die Daten in HDFS](#EMRforDynamoDB.CopyingData.HDFS.ViewingData)

## Kopieren von Daten mit dem Hive-Standardformat
<a name="EMRforDynamoDB.CopyingData.HDFS.DefaultFormat"></a>

**Example Von DynamoDB in HDFS**  
Verwenden Sie eine `INSERT OVERWRITE`-Anweisung, um direkt in HDFS zu schreiben.  

```
INSERT OVERWRITE DIRECTORY 'hdfs:///user/hadoop/hive-test'
SELECT * FROM ddb_features;
```
Die Datendatei in HDFS sieht folgendermaßen aus:  

```
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
```
Jedes Feld wird durch ein SoH-Zeichen getrennt (Anfang der Überschrift, 0x01). In der Datei wird SoH als **^A** angezeigt.

**Example Kopieren von HDFS in DynamoDB**  

1. Erstellen Sie eine externe Tabelle, die den unformatierten Daten in HDFS zugeordnet ist.

   ```
   CREATE EXTERNAL TABLE hdfs_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 'hdfs:///user/hadoop/hive-test';
   ```

1. Kopieren Sie die Daten in DynamoDB

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

## Kopieren von Daten in einem benutzerdefinierten Format
<a name="EMRforDynamoDB.CopyingData.HDFS.UserSpecifiedFormat"></a>

Wenn Sie ein anderes Feldtrennzeichen verwenden möchten, können Sie eine externe Tabelle erstellen, die dem HDFS-Verzeichnis zugeordnet ist. Sie können diese Vorgehensweise zum Erstellen von Datendateien mit CSV-Werten verwenden.

**Example Von DynamoDB in HDFS**  

1. Erstellen Sie eine externe Hive-Tabelle, die HDFS zugeordnet ist. Stellen Sie dabei sicher, dass die Datentypen mit den Typen der externen DynamoDB-Tabelle konsistent sind.

   ```
   CREATE EXTERNAL TABLE hdfs_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 'hdfs:///user/hadoop/hive-test';
   ```

1. Kopieren Sie die Daten aus DynamoDB.

   ```
   INSERT OVERWRITE TABLE hdfs_features_csv
   SELECT * FROM ddb_features;
   ```
Die Datendatei in HDFS sieht folgendermaßen aus:  

```
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 Kopieren von HDFS in DynamoDB**  
Mit einer einzigen HiveQL-Anweisung können Sie die DynamoDB-Tabelle mit den Daten aus HDFS auffüllen:  

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

## Kopieren von Daten ohne Spaltenmapping
<a name="EMRforDynamoDB.CopyingData.HDFS.NoColumnMapping"></a>

Sie können Daten aus DynamoDB in einem unformatierten Format kopieren und sie ohne Angabe von Datentypen oder Spaltenmapping in HDFS schreiben. Sie können diese Methode zum Erstellen eines Archivs von DynamoDB-Daten und zum Speichern in HDFS verwenden.



**Anmerkung**  
Wenn Ihre DynamoDB-Tabelle Attribute vom Typ Zuordnung, Liste, Boolescher Wert oder Null enthält, ist dies die einzige Möglichkeit, um Hive zum Kopieren von Daten aus DynamoDB in HDFS zu verwenden.

**Example Von DynamoDB in HDFS**  

1. Erstellen Sie eine externe Tabelle im Zusammenhang mit Ihrer DynamoDB-Tabelle. (In dieser HiveQL-Anweisung ist keine `dynamodb.column.mapping` enthalten.)

   ```
   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. Erstellen Sie eine weitere externe Tabelle im Zusammenhang mit Ihrem HDFS-Verzeichnis.

   ```
   CREATE EXTERNAL TABLE hdfs_features_no_mapping
       (item MAP<STRING, STRING>)
   ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\t'
   LINES TERMINATED BY '\n'
   LOCATION 'hdfs:///user/hadoop/hive-test';
   ```

1. Kopieren Sie die Daten aus DynamoDB in HDFS.

   ```
   INSERT OVERWRITE TABLE hdfs_features_no_mapping
   SELECT * FROM ddb_features_no_mapping;
   ```
Die Datendatei in HDFS sieht folgendermaßen aus:  

```
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"}
```
Jedes Feld beginnt mit einem STX-Zeichen (Textanfang, 0x02) und endet mit einem ETX-Zeichen (Textende, 0x03). In der Datei wird für STX **^B** und für ETX **^C** angegeben.

**Example Kopieren von HDFS in DynamoDB**  
Mit einer einzigen HiveQL-Anweisung können Sie die DynamoDB-Tabelle mit den Daten aus HDFS auffüllen:  

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

## Zugriff auf die Daten in HDFS
<a name="EMRforDynamoDB.CopyingData.HDFS.ViewingData"></a>

HDFS ist ein verteiltes Dateisystem, auf das alle Knoten im Amazon EMR-Cluster zugreifen können. Wenn Sie eine Verbindung zum Leader-Knoten über SSH herstellen, können Sie die Befehlszeilen-Tools für den Zugriff auf die Daten verwenden, die von Hive in HDFS geschrieben wurden.

HDFS ist nicht mit dem lokalen Dateisystem auf dem Leader-Knoten identisch. Sie können nicht mit Dateien und Verzeichnissen in HDFS arbeiten und dabei die Linux-Standardbefehle verwenden (wie `cat`, `cp`, `mv` oder `rm`). Verwenden Sie stattdessen den Befehl `hadoop fs` für diese Aufgaben.

Die folgenden Schritte setzen voraus, dass Sie die Daten aus DynamoDB in HDFS mit einem der in diesem Abschnitt beschriebenen Verfahren kopiert haben.

1. Wenn Sie sich an der Hive-Eingabeaufforderung befinden, beenden Sie die Linux-Eingabeaufforderung.

   ```
   hive> exit;
   ```

1. Listet den Inhalt des Verzeichnisses/user/hadoop/hive-test in HDFS auf. (Dies ist der Speicherort, an den Hive die Daten aus DynamoDB kopiert hat.)

   ```
   hadoop fs -ls /user/hadoop/hive-test
   ```

   Die Antwort sollte wie folgt aussehen:

   ```
   Found 1 items
   -rw-r--r-- 1 hadoop hadoop 29504 2016-06-08 23:40 /user/hadoop/hive-test/000000_0
   ```

   Der Dateiname (*000000\_0*) wird vom System generiert.

1. Zeigen Sie den Inhalt der -Datei an:

   ```
   hadoop fs -cat /user/hadoop/hive-test/000000_0
   ```
**Anmerkung**  
In diesem Beispiel ist die Datei relativ klein (etwa 29 KB). Seien Sie vorsichtig, wenn Sie diesen Befehl mit Dateien verwenden, die sehr groß sind oder nicht druckbare Zeichen enthalten.

1. (Optional) Sie können die Datendatei aus HDFS in das lokale Dateisystem auf dem Leader-Knoten kopieren. Anschließend können Sie mithilfe von Standardbefehlszeilen-Dienstprogrammen von Linux mit den Daten in der Datei arbeiten.

   ```
   hadoop fs -get /user/hadoop/hive-test/000000_0
   ```

   Mit diesem Befehl wird die Datei nicht überschrieben.
**Anmerkung**  
Das lokale Dateisystem auf dem Leader-Knoten verfügt über begrenzte Kapazität. Verwenden Sie diesen Befehl nicht mit Dateien, die größer als der im lokalen Dateisystem verfügbare Platz sind.