2013-07-29 19 views
9

Kann mir jemand sagen, was ist die Verwendung von --split-by und Grenze Abfrage in sqoop?Was sind die folgenden Befehle in sqoop?

Sqoop Import --connect jdbc: mysql: // localhost/my --username Benutzer --password 1234 --query '* wählen aus der Tabelle, wo id = 5 und $ BEDINGUNGEN' --split-by-Tabelle .id --target-dir/dir

Antwort

28

--split-by: Es verwendet, um die Spalte zu spezifizieren die Tabelle, die verwendet wird, um Splits für Importe zu generieren. Das bedeutet, dass angegeben wird, welche Spalte zum Erstellen der Teilung verwendet wird, während die Daten in den Cluster importiert werden. Es kann verwendet werden, um die Importleistung zu verbessern, indem eine größere Parallelität erreicht wird. Sqoop erstellt Splits, die auf Werten in einer bestimmten Spalte der Tabelle basieren, die vom Benutzer durch den Importbefehl split-by angegeben wird. Wenn es nicht verfügbar ist, wird der Primärschlüssel der Eingabetabelle zum Erstellen der Splits verwendet.

Grund zu verwenden: Manchmal hat der Primärschlüssel keine gleichmäßige Verteilung der Werte zwischen den Min- und Max-Werten (die zum Erstellen der Aufteilungen verwendet wird, wenn --split-by nicht verfügbar ist). In einer solchen Situation können Sie eine andere Spalte angeben, in der die Daten richtig verteilt sind, um Splits für effiziente Importe zu erstellen.

--boundary-Abfrage: standardmäßig Sqoop wird Abfrage select min() verwenden, max() von Grenzen, um herauszufinden, für Splits zu schaffen. In einigen Fällen ist diese Abfrage nicht optimal, sodass Sie jede beliebige Abfrage angeben können, die zwei numerische Spalten mit dem Argument --boundary-query zurückgibt.

Grund zu verwenden: Wenn --split-by Ihnen nicht die optimale Leistung gibt, können Sie diese verwenden, um die Leistung weiter zu verbessern.

10

Mit Sqoop können Sie Daten parallel importieren und --split-by und --boundary-query ermöglichen Ihnen mehr Kontrolle. Wenn Sie nur eine Tabelle importieren, wird sie den PRIMARY KEY verwenden. Wenn Sie jedoch eine komplexere Abfrage durchführen, müssen Sie die Spalte angeben, um die parallele Aufteilung durchzuführen.

heißt

sqoop import \ 
    --connect 'jdbc:mysql://.../...' \ 
    --direct \ 
    --username uname --password pword \ 
    --hive-import \ 
    --hive-table query_import \ 
    --boundary-query 'SELECT 0, MAX(id) FROM a' \ 
    --query 'SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND $CONDITIONS'\ 
    --num-mappers 3 
    --split-by a.id \ 
    --target-dir /data/import \ 
    --verbose 

Boundary-Abfrage können Sie eine optimierte Abfrage geben Sie die max, min zu erhalten. Andernfalls versucht es, MIN (a.id), MAX (a.id) ON - Abfrage-Anweisung.

Die Ergebnisse werden (wenn min = 0, max = 30) 3 Abfragen, die parallel laufen lassen:

SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 0 AND 10; 
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 11 AND 20; 
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 21 AND 30; 
+0

Entschuldigung. Ich verstehe es immer noch nicht. Was ist --split-by? ist es so, etwas mit der Verarbeitung des Befehls zu tun? – DrewRose

16

--split-by verwendet wird, um die Werte aus der Tabelle für den Mapper gleichmäßig zu verteilen also sagen u 100 einzigartigen Datensätze (Primärschlüssel) und wenn es 4-Mapper ist, --split-by (Primärschlüsselspalt) hilft Ihnen, den Datensatz gleichmäßig unter den Mappern zu verteilen.

$ BEDINGUNGEN wird von Sqoop-Prozess verwendet, es wird intern durch eine eindeutige Bedingung ersetzt, um den Datensatz zu erhalten. Wenn Sie einen parallelen Import ausführen, führen die Map-Tasks Ihre Abfrage mit verschiedenen Werten aus, die in $ CONDITIONS ersetzt werden. zB kann ein Mapper "select bla from foo WHERE (id> = 0 UND id < 10000)" ausführen, und der nächste Mapper kann "select bla from foo WHERE (id> = 10000 AND id < 20000)" und so weiter ausführen .

1

Auch wenn wir --query Wert in doppelten Anführungszeichen (“„) angeben, müssen wir $CONDITIONS mit einem slash(\)

--query "select * from table where id=5 AND \$CONDITIONS" 

oder sonst

--query 'select * from table where id=5 AND $CONDITIONS' 
0

--split-by Klausel vorangehen wird verwendet, um die Spalten der Tabelle anzugeben, die zum Generieren von Splits für Datenimporte verwendet werden. Diese Klausel gibt die Spalten an, die beim Import der Daten in den Hadoop-Cluster zum Teilen verwendet werden. -split-by Klausel hilft, eine verbesserte Leistung durch größere Parallelität zu erreichen. Apache Sqoop erstellt Splits basierend auf den Werten in den Spalten, die in der Klausel -split-by des import-Befehls angegeben sind. Wenn die Klausel -split-by nicht angegeben ist, wird der Primärschlüssel der Tabelle zum Erstellen der Splits beim Datenimport verwendet. Manchmal hat der Primärschlüssel der Tabelle möglicherweise keine gleichmäßig verteilten Werte zwischen dem minimalen und maximalen Bereich. Unter diesen Umständen kann -split-by Klausel verwendet werden, um eine andere Spalte anzugeben, die eine gleichmäßige Verteilung von Daten zum Erstellen von Teilbereichen aufweist, so dass der Datenimport effizient ist.

Verwandte Themen