2017-06-28 2 views
0

Ich habe zwei Tabellen in Cassandra, der erste ist "Firma", wo Spalten "Firma_Name (Zeichenfolge) und Firma_ID (Int)" und der zweite ist "Daten", wo Spalten sind "company_id (int), worker (string) und status (boolean)".Zwei verschiedene Abfragen in einer Zeile in Cassandra

Ich muss alle Worker und deren Status aus Daten auswählen, wobei companyd_id = 1, aber ich muss company_id mithilfe von company_name erhalten, also führe ich die erste Abfrage aus, um company_id aus der ersten Tabelle zu erhalten (select company_id von Firma wo compani_name = name1 ') und ich bekomme 1 als Abfrageergebnis, zB. Danach verwende ich das Ergebnis dieser Abfrage für eine andere Abfrage, um "worker" und "status" aus der Datentabelle zu erhalten (wähle worker aus data wo company_id) = 1) und (wählen Sie den Status aus den Daten aus, wobei company_id = 1).

SO, würde ich gerne wissen, gibt es eine Möglichkeit, diese beiden Abfragen in einer Zeile in Cassandra auszuführen?

Danke

+1

Klingt wie Sie brauchen [verbindet] (https://www.datastax.com/2015/03/how-to-do-joins-in-apache-cassandra- and-datastax-enterprise), aber was nützt 'NoSql' cassandra für Sie? Ich denke, dass Sie Ihren Entwurf betrachten müssen –

+0

Lieber Jyothi Babu Araja, danke für Ihren Kommentar. Ich verwende Cassandra aufgrund großer Datenmengen, und ich denke, dass diese Struktur für diesen Fall am besten geeignet ist. – Henrik

+0

Sie müssen Ihr Datenmodell entwerfen. Habe eine Tabelle und das hat alle Daten. Als nächstes machen company_name als Partitionsschlüssel und company_id als Clustering-Schlüssel. Sie müssen die Entitäten und ihre Beziehungen verstehen und ein Datenmodell entsprechend erstellen. – Bigby

Antwort

1

Wie in einem Kommentar zu Ihrer Frage darauf hingewiesen, mit Ihrem vorhandenen Datenmodell Sie im Wesentlichen fragen, wie eine Verknüpfung zu tun. Cassandra unterstützt jedoch keine Joins und wird dies in absehbarer Zeit (wahrscheinlich nie) aufgrund der Design- und Implementierungsoptionen tun. Im Gegensatz zu einer relationalen Datenbank, in der Sie zunächst die Tabellen entwerfen, schreiben Sie Ihre Abfragen. In Cassandra definieren Sie am besten Ihre Abfragen und erstellen dann Tabellen, die diese Abfragen unterstützen. Dies bedeutet, dass Sie mehrere denormalisierte Tabellen mit doppelten Daten haben, aber Cassandra wurde auf die Idee von Disketten entwickelt, die billig sind.

Wenn Sie mit den Tabellen, die Sie jetzt haben, fortfahren möchten, sollten Sie sich Apache Spark mit dem Spark Cassandra Connector ansehen, der ein Computing-Framework für Joins in Cassandra-Tabellen bietet.

Stattdessen Funken verwenden, können Sie eine neue normalisierte Tabelle wie folgt erstellen:

CREATE TABLE workers_by_company_name (
    company_name text PRIMARY KEY, 
    company_id int, 
    worker text, 
    status boolean 
) 

Dann Sie alle Informationen erhalten, können Sie mit einem SELECT * FROM workers_by_company_name WHERE company_name = 'your_company';

brauchen Und wenn Sie waren zu halten In zwei anderen Tabellen möchten Sie einen Atomic Batch mit drei INSERT-Anweisungen (einen für jede Tabelle) erstellen, wenn Sie diese Daten hinzufügen oder ändern.

Weiterführende Literatur für Datenmodellierung: http://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling

+0

Vielen Dank für Sie antworten liebe Fromanator. Ich denke, ich werde kein anderes Programm verwenden und zwei verschiedene Abfragen ausführen. – Henrik

+0

Es ist die richtige Erklärung. Hen, du brauchst nicht zwei verschiedene Frameworks zu benutzen. Es ist eine Datenmodellierungsfrage und Sie müssen das verstehen, um Ihr Problem zu lösen. – Bigby

+0

Ja, ich denke schon. Vielen Dank – Henrik

Verwandte Themen