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
In den folgenden Beispielen werden Hive-Befehle verwendet, um Operationen wie das Exportieren von Daten nach Amazon S3 oder das Importieren von Daten in DynamoDBHDFS, das Verbinden von Tabellen, das Abfragen von Tabellen und mehr auszuführen.
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 einem Speicherort in Amazon S3 zuordnen, ordnen Sie sie nicht dem Stammpfad des Buckets, s3://amzn-s3-demo-bucket, zu, da dies zu Fehlern führen kann, wenn Hive die Daten in Amazon S3 schreibt. Ordnen Sie die Tabelle stattdessen einem Unterpfad des Buckets zu, s3://amzn-s3-demo-bucket/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 INSERT OVERWRITE Befehl aufrufen, um die Daten in ein externes Verzeichnis zu schreiben. Im folgenden Beispiel
s3://bucketname/path/subpath/
ist ein gültiger Pfad in Amazon S3. Passen Sie die Spalten und Datentypen im CREATE Befehl an die Werte in Ihrer DynamoDB an. 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 * FROMhiveTableName
;
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 Daten von DynamoDB INSERT OVERWRITE nach s3_export exportieren, werden die Daten im angegebenen Format ausgegeben. Im folgenden Beispiel werden die Daten als kommagetrennte Werte () ausgegeben. CSV
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 TABLEs3_export
(a_col string, b_col bigint, c_col array<string>
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/path/subpath/
'; INSERT OVERWRITE TABLEs3_export
SELECT * FROMhiveTableName
;
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 eineEXTERNAL
-Tabelle in Amazon S3 erstellen, können Sie den BefehlINSERT 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 in Hive 0.8.1.5 oder höher verfügbar, das auf Amazon 2.2 unterstützt wird. EMR AMI x und höher.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 TABLEs3TableName
SELECT * FROMhiveTableName
;
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 Algorithmus Lempel-Ziv-Oberhumer (LZO) 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 TABLElzo_compression_table
(line STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://bucketname/path/subpath/
'; INSERT OVERWRITE TABLElzo_compression_table
SELECT * FROMhiveTableName
;Die verfügbaren Kompressions-Codecs sind:
-
org.apache.hadoop.io.compress. GzipCodec
-
org.apache.hadoop.io.com/press. DefaultCodec
-
com.hadoop.compression.lzo. LzoCodec
-
com.hadoop.compression.lzo. LzopCodec
-
org.apache.hadoop.io.com/press. 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
ist ein gültiger HDFS Pfad undhiveTableName
ist eine Tabelle in Hive, die auf DynamoDB verweist. Dieser Exportvorgang ist schneller als der Export einer DynamoDB-Tabelle nach Amazon S3, da Hive 0.7.1.1 ihn HDFS als Zwischenschritt beim Exportieren von Daten nach Amazon S3 verwendet. Das folgende Beispiel zeigt, wie Siedynamodb.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 * FROMhiveTableName
;Sie können Daten auch exportieren, indem Sie die Formatierung und Komprimierung HDFS verwenden, wie oben für den Export nach Amazon S3 gezeigt. Ersetzen Sie dazu einfach das Amazon S3 S3-Verzeichnis in den obigen Beispielen durch ein HDFS Verzeichnis.
Um nicht druckbare Daten mit UTF 8 Zeichen in Hive zu lesen
-
Sie können mit Hive nicht druckbare Daten mit einer Länge von UTF 8 Zeichen lesen und schreiben, indem Sie die
STORED AS SEQUENCEFILE
Klausel verwenden, wenn Sie die Tabelle erstellen. 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 Funktion verwenden, um nicht druckbare UTF -8-kodierte Zeichen zu verarbeiten.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 TABLEs3_export
(a_col string, b_col bigint, c_col array<string>
) STORED AS SEQUENCEFILE LOCATION 's3://bucketname/path/subpath/
'; INSERT OVERWRITE TABLEs3_export
SELECT * FROMhiveTableName
;
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. Cluster, die auf EC2 m1.xlarge-Instances ausgeführt werden, erzeugen beispielsweise 8 Mapper pro Instanz. 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 jedem EC2 Instance-Typ erzeugt 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 (AmazonEMR) 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 TABLEhiveTableName
(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 TABLEhiveTableName
SELECT * FROMs3_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 Spaltentypmap<string, string>
verfügen. Wenn Sie dann eine Hive-Tabelle erstellen, die mit DynamoDB verknüpft ist, können Sie den BefehlINSERT 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 in Hive 0.8.1.5 oder höher verfügbar, was auf Amazon EMR AMI 2.2.3 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 TABLEhiveTableName
(item map<string,string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1
"); INSERT OVERWRITE TABLEhiveTableName
SELECT * FROMs3TableName
;
Um eine Tabelle von nach DynamoDB HDFS zu importieren
-
Sie können Amazon EMR und Hive verwenden, um Daten von nach DynamoDB HDFS zu 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 TABLEhiveTableName
(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 TABLEhiveTableName
SELECT * FROMhdfs_import
;
Abfragen von Daten in DynamoDB
Die folgenden Beispiele zeigen die verschiedenen Möglichkeiten, wie Sie Amazon verwenden könnenEMR, um in DynamoDB gespeicherte Daten abzufragen.
So finden Sie den größten Wert für eine zugeordnete Spalte (max
)
-
Verwenden Sie Hive-Befehle wie die folgenden. Im ersten Befehl erstellt die CREATE Anweisung eine Hive-Tabelle, 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 TABLEhive_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 in Amazon S3 gespeicherte CSV Datei lädt, und hive_purchases ist eine Tabelle, die auf Daten in DynamoDB verweist. Das folgende Beispiel verknüpft Kundendaten, die als CSV Datei in Amazon S3 gespeichert sind, mit in DynamoDB gespeicherten Bestelldaten, um einen Datensatz zurückzugeben, der Bestellungen darstellt, die von Kunden aufgegeben wurden, deren Namen „Miller“ enthalten.
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 TABLECustomer_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 die CREATE TABLE Aussagen aus Gründen der Übersichtlichkeit und Vollständigkeit in jedes Beispiel aufgenommen. 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.