2016-01-08 15 views
9

Ich verwende derzeit MySQL als Datenbank für meine Anwendung in PHP. Jetzt müssen Sie jedoch zu AWS DynamoDB migrieren. Da ich neu in DynamoDB bin, kann mir jemand helfen, JOIN in DynamoDB zu verwenden?Verwenden von JOIN-Abfrage in AWS DynamoDB mit PHP

Gemäß meiner Feststellung, habe ich festgestellt, dass JOINs mit Hive und Amazon EMR verwendet werden können. Aber auch hier gibt es ein Problem, dass keine Ressource für die Verwendung von Hive mit PHP zur Verfügung steht.

+0

Ah, die Freuden des Lernens zweier Dinge (Dynamo _and_ MySQL) zu tun _eine_ Aufgabe. –

+0

Sie sollten DynamoDB wahrscheinlich nicht mit einer JOIN-Anforderung verwenden - die Daten vor dem Hochladen zuerst denormalisieren, weiterhin MySQL verwenden oder eine andere Datenbank auswählen, die besser ist bei JOINs –

Antwort

3

hallo vielleicht können Sie versuchen, diese

zwei Tabellen DynamoDB Die Verbindung beizutreten auf dem Cluster berechnet und zurückgegeben. Der Join findet nicht in DynamoDB statt. In diesem Beispiel wird eine Liste mit Kunden und deren Käufen für Kunden zurückgegeben, die mehr als zwei 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"); 

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; 

Um zwei Tabellen aus verschiedenen Quellen

Im folgende Beispiel zu verbinden, ist Customer_S3 eine Hive-Tabelle, die eine CSV-Datei in Amazon S3 und hive_purchases gespeichert lädt eine Tabelle, die Verweise Daten in DynamoDB. Im folgenden Beispiel werden Kundendaten, die in Amazon S3 als CSV-Datei gespeichert sind, mit in DynamoDB gespeicherten Auftragsdaten zusammengeführt, um eine Reihe von Daten zurückzugeben, die Bestellungen von Kunden mit "Miller" im Namen enthalten.

CREATE TABLE hive_purchases EXTERNAL (customerId Bigint, total_cost Doppel, items_purchased array) gespeicherten TBLPROPERTIES 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' ("dynamodb.table.name" = "Einkäufe", "dynamodb.column.mapping" = "customerId: CustomerId, total_cost: Kosten, Artikel_abgekauft: Artikel");

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%'; 

für weitere Informationen können Sie die Dokumentation DynamoDB Export , Import Querys

viel Glück lesen und versuchen

+1

Danke für die Hilfe, aber ich habe es bereits versucht. Dies ist die Syntax für Hive und wie ich in meiner Frage erwähnt habe, gibt es KEINE Ressource, um Hive mit PHP zu benutzen. Auch für die weitere Antwort, versuchen Sie, mit einer Lösung zu kommen, kopieren Sie das Einfügen ist keine Antwort, hätte ich nicht auf Stackoverflow gepostet, wenn es so einfach war. – Sanchit

1

Sind Sie nach dieser für die Zwecke Migrationsdaten? Oder für deine App?

Haben Sie ein Beispiel für die Daten, denen Sie beitreten möchten? Die Datenmodellierung unterscheidet sich dramatisch zwischen SQL- und NoSQL-Datenbanken, so wie es @AndrewTempleton sagte, müssen Sie möglicherweise Ihre Daten denormalisieren. Einer der Schlüssel zur Modellierung mit DynamoDB ist das Verständnis der Zugriffsmuster für Ihre Daten. Verbinden Sie dies mit der logischen Struktur Ihrer Daten und Sie können damit beginnen, sie effektiv zu modellieren.

Wenn es für Ihre Anwendung ist, können Sie möglicherweise eine einzelne Tabelle erstellen und Ihre verbundene Tabelle in der übergeordneten Tabelle verschachteln - Sie müssen also nichts hinzufügen.

Wenn Sie weiterhin zwei Tabellen haben, gibt es keine referenzielle Integrität, es sei denn, Sie erstellen sie selbst. Wenn Sie die beiden Tabellen verbinden möchten, müssen Sie dies programmgesteuert tun - eine äußere Schleife von Aufrufe (oder BatchGetItem) für Ihre Eltern und eine innere Schleife von GetItem Anrufe für Ihr Kind.

Alternativ können Sie die beiden Tabellen beibehalten und DynamoDB-Streams verwenden und eine denormalisierte "Ansicht" der beiden Tabellen erstellen. Einige Überlegungen zur Konsistenz müssen berücksichtigt werden.

Also, im Wesentlichen ist eine Verknüpfung in DynamoDB nur ein paar Schleifen. Es ist ein ganz anderes Denken.

Wenn Sie in der RDBMS-Welt fortfahren möchten, haben Sie RDS für MySQL in Betracht gezogen.

3

Nun, die Migration von SQL zu NoSQL ist eine schwierige Entscheidung. Vielleicht möchten Sie einen Blick auf this white page werfen, um zu sehen, ob Ihre Anwendung in der NoSQL-Welt überleben kann.

Verwandte Themen