Hive-Befehlsbeispiele für das Exportieren, Importieren und Abfragen von Daten in DynamoDB - Amazon EMR

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.

Hive-Befehlsbeispiele für das Exportieren, Importieren und Abfragen von Daten in DynamoDB

Die folgenden Beispiele verwenden Hive-Befehle für Operationen wie das Exportieren von Daten nach DynamoDB oder HDFS, das Importieren von Daten in Amazon S3, das Verknüpfen und Abfragen von Tabellen usw.

Operationen für eine Hive-Tabelle verweisen auf Daten, die in DynamoDB gespeichert sind. Hive-Befehle sind abhängig von den Einstellungen der DynamoDB-Tabelle für den bereitgestellten Durchsatz. Die Daten, die abgerufen werden, umfassen die Daten, die zum Zeitpunkt der Verarbeitung der Hive-Operationsanforderung durch DynamoDB in die DynamoDB-Tabelle geschrieben werden. Wenn der Datenabruf viel Zeit in Anspruch nimmt, wurden einige der vom Hive-Befehl zurückgegebenen Daten möglicherweise seit Starten des Hive-Befehls in DynamoDB aktualisiert.

Die Hive-Befehle DROP TABLE und CREATE TABLE gelten nur für die lokalen Tabellen in Hive und erstellen bzw. löschen keine Tabellen in DynamoDB. Wenn Ihre Hive-Abfrage auf eine Tabelle in DynamoDB verweist, muss diese bereits vorhanden sein, bevor Sie die Abfrage ausführen. Weitere Informationen zum Erstellen und Löschen von Tabellen in DynamoDB finden Sie unter Arbeiten mit Tabellen in DynamoDB im Amazon-DynamoDB-Entwicklerhandbuch.

Anmerkung

Wenn Sie eine Hive-Tabelle mit einem Speicherort in Amazon S3 verknüpfen, weisen Sie sie nicht dem Stammpfad des Buckets s3://mybucket zu, da dies Fehler verursachen kann, wenn Hive die Daten nach Amazon S3 schreibt. Weisen Sie die Tabelle stattdessen einem Unterpfad des Buckets zu ("s3://mybucket/mypath").

Exportieren von Daten aus DynamoDB

Sie können mit Hive Daten aus DynamoDB exportieren.

So exportieren Sie eine DynamoDB-Tabelle in einen Amazon-S3-Bucket
  • Erstellen Sie eine Hive-Tabelle, die auf in DynamoDB gespeicherte Daten verweist. Anschließend können Sie den Befehl INSERT OVERWRITE aufrufen, um die Daten in ein externes Verzeichnis zu schreiben. Im folgenden Beispiel ist s3://bucketname/path/subpath/ ein gültiger Pfad in Amazon S3. Passen Sie die Spalten und Datentypen im CREATE-Befehl an, um mit den Werten in Ihrer DynamoDB übereinzustimmen. Sie können diese Methode zum Erstellen eines Archivs Ihrer DynamoDB-Daten in Amazon S3 verwenden.

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); INSERT OVERWRITE DIRECTORY 's3://bucketname/path/subpath/' SELECT * FROM hiveTableName;
So exportieren Sie eine DynamoDB-Tabelle in einen Amazon S3-Bucket mit Formatierung
  • Erstellen Sie eine externe Tabelle, die auf einen Speicherort in Amazon S3 verweist. Dies wird unten als "s3_export" gezeigt. Geben Sie während des CREATE-Aufrufs die Zeilenformatierung für die Tabelle an. Wenn Sie dann INSERT OVERWRITE für den Export von Daten aus DynamoDB in s3_export verwenden, werden die Daten in dem angegebenen Format geschrieben. Im folgenden Beispiel werden die Daten als CSV-Werte geschrieben.

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); CREATE EXTERNAL TABLE s3_export(a_col string, b_col bigint, c_col array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;
So exportieren Sie eine DynamoDB-Tabelle in einen Amazon-S3-Bucket ohne Angabe einer Spaltenzuordnung
  • Erstellen Sie eine Hive-Tabelle, die auf in DynamoDB gespeicherte Daten verweist. Dies ähnelt dem vorhergehenden Beispiel mit der Ausnahme, dass Sie keine Spaltenzuordnung angeben. Die Tabelle muss über genau einen Spaltentyp map<string, string> verfügen. Wenn Sie dann eine EXTERNAL-Tabelle in Amazon S3 erstellen, können Sie den Befehl INSERT OVERWRITE zum Schreiben der Daten von DynamoDB nach Amazon S3 aufrufen. Sie können diese Methode zum Erstellen eines Archivs Ihrer DynamoDB-Daten in Amazon S3 verwenden. Da es keine Spaltenzuordnung gibt, können Sie keine Tabellen abfragen, die auf diese Weise exportiert werden. Das Exportieren von Daten ohne Angabe einer Spaltenzuordnung ist ab Hive 0.8.1.5 verfügbar, was unter Amazon-EMR-AMI 2.2.x und höher unterstützt wird.

    CREATE EXTERNAL TABLE hiveTableName (item map<string,string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1"); CREATE EXTERNAL TABLE s3TableName (item map<string, string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3TableName SELECT * FROM hiveTableName;
So exportieren Sie eine DynamoDB-Tabelle in einen Amazon-S3-Bucket mit Datenkomprimierung
  • Hive bietet mehrere Kompressions-Codecs an, die Sie während der Hive-Sitzung einrichten können. Dadurch werden die exportierten Daten im angegebenen Format komprimiert. Im folgenden Beispiel werden die exportierten Dateien mit dem Lempel-Ziv-Oberhumer (LZO)-Algorithmus komprimiert.

    SET hive.exec.compress.output=true; SET io.seqfile.compression.type=BLOCK; SET mapred.output.compression.codec = com.hadoop.compression.lzo.LzopCodec; CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); CREATE EXTERNAL TABLE lzo_compression_table (line STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE lzo_compression_table SELECT * FROM hiveTableName;

    Die verfügbaren Kompressions-Codecs sind:

    • org.apache.hadoop.io.com/press. GzipCodec

    • org.apache.hadoop.io.com/press. DefaultCodec

    • com.hadoop.compression.lzo. LzoCodec

    • com.hadoop.compression.lzo. LzopCodec

    • org.apache.hadoop.io.compress.BZip2Codec

    • org.apache.hadoop.io.com/press. SnappyCodec

So exportieren Sie eine DynamoDB-Tabelle nach HDFS
  • Verwenden Sie den folgenden Hive-Befehl, wobei hdfs: ///DirectoryName ein gültiger HDFS-Pfad und eine Tabelle in Hive ist, die auf hiveTableNameDynamoDB verweist. Dieser Exportvorgang ist schneller als der Export einer DynamoDB-Tabelle nach Amazon S3, da Hive 0.7.1.1 als Zwischenschritt beim Exportieren von Daten nach Amazon S3 HDFS verwendet. Das folgende Beispiel zeigt, wie Sie dynamodb.throughput.read.percent auf 1.0 festlegen, um die Leseanforderungsrate zu erhöhen.

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); SET dynamodb.throughput.read.percent=1.0; INSERT OVERWRITE DIRECTORY 'hdfs:///directoryName' SELECT * FROM hiveTableName;

    Sie können auch Daten nach HDFS via Formatierung und Kompression exportieren, wie oben beim Export nach Amazon S3 gezeigt. Ersetzen Sie dazu einfach das Amazon-S3-Verzeichnis in den Beispielen oben durch ein HDFS-Verzeichnis.

So lesen Sie nicht druckbare UTF-8-Zeichendaten in Hive
  • Sie können nicht druckbare UTF-8-Zeichendaten mit Hive lesen und schreiben, indem Sie beim Erstellen der Tabelle die STORED AS SEQUENCEFILE-Klausel verwenden. A SequenceFile ist das Hadoop-Binärdateiformat. Sie müssen Hadoop verwenden, um diese Datei zu lesen. Das folgende Beispiel zeigt, wie Daten aus DynamoDB nach Amazon S3 exportiert werden. Sie können diese Funktionalität für die Verarbeitung von nicht druckbaren UTF-8-kodierten Zeichen verwenden.

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); CREATE EXTERNAL TABLE s3_export(a_col string, b_col bigint, c_col array<string>) STORED AS SEQUENCEFILE LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;

Importieren von Daten in DynamoDB

Wenn Sie mit Hive Daten in DynamoDB schreiben möchten, stellen Sie sicher, dass die Anzahl der Schreibkapazitätseinheiten größer als die Anzahl der Mapper im Cluster ist. Zum Beispiel produzieren Cluster, die auf m1.xlarge-EC2-Instances ausgeführt werden, acht Mapper pro Instance. Bei einem Cluster mit 10 Instances ergäbe dies 80 Mapper. Wenn Ihre Schreibkapazitätseinheiten nicht größer als die Anzahl der Mapper im Cluster sind, verbraucht der Hive-Schreibvorgang möglicherweise den gesamten Schreibdurchsatz oder versucht, mehr Durchsatz zu verbrauchen, als zur Verfügung gestellt wird. Weitere Informationen zur Anzahl der Mapper, die von den einzelnen EC2-Instance-Typen produziert werden, finden Sie unter Konfigurieren von Hadoop.

Die Anzahl der Mapper in Hadoop wird durch die Input Splits gesteuert. Wenn es zu wenig Splits gibt, ist Ihr Schreibbefehl ggf. nicht in der Lage, den gesamten verfügbaren Schreibdurchsatz zu verbrauchen.

Wenn ein Element mit demselben Schlüssel in der DynamoDB-Zieltabelle vorhanden ist, wird es überschrieben. Wenn kein Element mit dem Schlüssel in der DynamoDB-Zieltabelle vorhanden ist, wird das Element eingefügt.

So importieren Sie Daten aus Amazon S3 zu DynamoDB
  • Sie können Amazon EMR (Amazon EMR) und Hive verwenden, um Daten von Amazon S3 nach DynamoDB zu schreiben.

    CREATE EXTERNAL TABLE s3_import(a_col string, b_col bigint, c_col array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/path/subpath/'; CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); INSERT OVERWRITE TABLE hiveTableName SELECT * FROM s3_import;
So importieren Sie eine Tabelle von einem Amazon-S3-Bucket in DynamoDB ohne Angabe einer Spaltenzuordnung
  • Erstellen Sie eine EXTERNAL-Tabelle, die auf die in Amazon S3 gespeicherten Daten verweist, die zuvor von DynamoDB exportiert wurden. Stellen Sie vor dem Import sicher, dass die Tabelle in DynamoDB vorhanden ist und über das gleiche Schlüsselschema wie die zuvor exportierte DynamoDB-Tabelle verfügt. Die Tabelle muss außerdem über genau einen Spaltentyp map<string, string> verfügen. Wenn Sie dann eine Hive-Tabelle erstellen, die mit DynamoDB verknüpft ist, können Sie den Befehl INSERT OVERWRITE zum Schreiben der Daten von Amazon S3 nach DynamoDB aufrufen. Da es keine Spaltenzuordnung gibt, können Sie keine Tabellen abfragen, die auf diese Weise importiert werden. Das Importieren von Daten ohne Angabe einer Spaltenzuordnung ist ab Hive 0.8.1.5 verfügbar, was unter Amazon EMR AMI 2.2.3.x und höher unterstützt wird.

    CREATE EXTERNAL TABLE s3TableName (item map<string, string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://bucketname/path/subpath/'; CREATE EXTERNAL TABLE hiveTableName (item map<string,string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1"); INSERT OVERWRITE TABLE hiveTableName SELECT * FROM s3TableName;
So importieren Sie eine Tabelle von HDFS in DynamoDB
  • Sie können mit Amazon EMR und Hive Daten von HDFS nach DynamoDB schreiben.

    CREATE EXTERNAL TABLE hdfs_import(a_col string, b_col bigint, c_col array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 'hdfs:///directoryName'; CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); INSERT OVERWRITE TABLE hiveTableName SELECT * FROM hdfs_import;

Abfragen von Daten in DynamoDB

Die folgenden Beispiele zeigen die verschiedenen Möglichkeiten zur Verwendung von Amazon EMR zum Abfragen von Daten in DynamoDB.

So finden Sie den größten Wert für eine zugeordnete Spalte (max)
  • Verwenden Sie Hive-Befehle wie die folgenden. Im ersten Befehl wird durch die CREATE-Anweisung eine Hive-Tabelle erstellt, die auf in DynamoDB gespeicherte Daten verweist. Die SELECT-Anweisung verwendet dann diese Tabelle, um in DynamoDB gespeicherte Daten abzufragen. Im folgenden Beispiel wird nach der größten Bestellung eines bestimmten Kunden gesucht.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); SELECT max(total_cost) from hive_purchases where customerId = 717;
So aggregieren Sie Daten mit der GROUP BY-Klausel
  • Sie können die GROUP BY-Klausel zum Sammeln von Daten über mehrere Datensätze hinweg verwenden. Diese Klausel wird häufig in Verbindung mit einer Aggregationsfunktion wie „sum“, „count“, „min“ oder „max“ eingesetzt. Das folgende Beispiel gibt eine Liste der größten Bestellungen von Kunden zurück, die mehr als drei Bestellungen aufgegeben haben.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); SELECT customerId, max(total_cost) from hive_purchases GROUP BY customerId HAVING count(*) > 3;
So verknüpfen Sie zwei DynamoDB-Tabellen
  • Im folgenden Beispiel werden zwei Hive-Tabellen Daten in DynamoDB zugeordnet. Dann wird ein Join zwischen diesen beiden Tabellen aufgerufen. Der Join wird auf dem Cluster verarbeitet und zurückgegeben. Der Join wird nicht in DynamoDB ausgeführt. In diesem Beispiel wird eine Liste von Kunden mit ihren Einkäufen angezeigt, die mehr als zwei Bestellungen getätigt haben.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); CREATE EXTERNAL TABLE hive_customers(customerId bigint, customerName string, customerAddress array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Customers", "dynamodb.column.mapping" = "customerId:CustomerId,customerName:Name,customerAddress:Address"); Select c.customerId, c.customerName, count(*) as count from hive_customers c JOIN hive_purchases p ON c.customerId=p.customerId GROUP BY c.customerId, c.customerName HAVING count > 2;
So verknüpfen Sie zwei Tabellen aus verschiedenen Quellen
  • Im folgenden Beispiel ist Customer_S3 eine Hive-Tabelle, die eine CSV-Datei lädt, die in Amazon S3 gespeichert ist, und hive_purchases ist eine Tabelle, die auf Daten in DynamoDB verweist. Das folgende Beispiel verbindet Kundendaten, die in Form einer CSV-Datei in Amazon S3 gespeichert sind, mit Daten in DynamoDB, um Daten für Bestellungen zurückzugeben, die von Kunden mit „Miller“ im Namen aufgegeben wurden.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); CREATE EXTERNAL TABLE Customer_S3(customerId bigint, customerName string, customerAddress array<String>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/path/subpath/'; Select c.customerId, c.customerName, c.customerAddress from Customer_S3 c JOIN hive_purchases p ON c.customerid=p.customerid where c.customerName like '%Miller%';
Anmerkung

In den vorherigen Beispielen wurden aus Gründen der Klarheit und Vollständigkeit die CREATE TABLE-Anweisungen in jedes Beispiel eingefügt. Bei Ausführung mehrerer Abfragen oder Exportoperationen für eine bestimmte Hive-Tabelle müssen Sie die Tabelle nur einmal zu Beginn der Hive-Sitzung erstellen.