2017-05-02 2 views
0

Ich habe Probleme bei der Übergabe von Argumenten an Sqoop in einem Bash-Skript.Fehler bei der Interpretation der Variablen mit Sqoop

Sqoop ist ein Werkzeug, um Tabellen von RDB (Oracle in diesem speziellen Fall) zu Hive zu übertragen. Es ist ein Kommandozeilen-Tool wie folgt aufgerufen:

sqoop import --connect <string> --direct --table <table> --query <query> .... 

ich den Befehl bin Erzeugung innerhalb des Skripts zu starten, wobei Werte eine Datei bilden und sie mit awk Parsen.
Alle Argumente sind ok, außer der - Anfrage eins. Dieses Argument wird verwendet, um die Abfrage an die Quelle für die Datenextraktion zu übergeben. Es akzeptieren dieses Format:

select very long list of columns from schema.table where \$CONDITIONS 

DIE \ $ BEDINGUNGEN ist eine Variable, dass Sqoop Ersatz, so dass es in diesem sehr wörtlich Format zwingend vorgeschrieben ist, Backslash enthalten.

Ich bin mir sicher, dass das Problem mit der --Query Parameter ist, denn wenn ich das Skript ausführen, wie es ist, aber den Wert für --query im Klartext hardcodieren, funktioniert es.

klar zu sein, das ist der Befehl, den ich in meinem Skript habe:

scoop import --connect "$source" --table "$sourcetab" \ 
-- hiveimport --some more other commands --querytot "$query" 

Also, ich verstehe nicht, aus einem Grunde, gibt es ein Problem mit diesem Wert.
Bisher habe ich versucht, diese Werte bilden --query:

Gegeben:

query="select col1 col2 col3 col4 col4 from schema.table" 

ich schon versucht:

1. querytot="$query where \\$CONDITIONS" 

2. cond=" where '\$CONDITIONS'" 
    querytot="$query$cond" 

3. $(echo "$query$cond") <-- placed directly in the sqoop command 

4. echo "$query$cond" > query_file, and passed it to Sqoop via --options-file 

Alle diese ohne Erfolg.
Würden Sie mir bitte helfen? Ich stecke fest.

Dank

+0

bieten sowohl das Protokoll der 'bash -x yourscript' zeigt, wie es die' sqoop' Zeile ruft, und eine Arbeitsleitung selbst von Hand laufen nach 'set -x' Laufen (** mit ** der 'set -x' Ausgabe dieses erfolgreichen Befehlszeilenaufrufs, der anzeigt, wie die Shell es interpretierte). –

+0

(Wenn Sie sagen, "den Wert für' --query' im Klartext fest codieren ", ist es überhaupt nicht klar, welche Zitate Sie dafür verwenden, wenn überhaupt, und das sind ** ganz wesentliche ** Informationen). –

+0

@CharlesDuffy Ich werde die Informationen so schnell wie möglich zur Verfügung stellen.Hardcoding bedeutet, dass ich die SELECT-Anweisung im Klartext schreibe und keine Variablen verwende. Das heißt, '--abfrage col1 col2 col3 aus schema.table where \ $ CONDITIONS' – Omar

Antwort

0

Die einfache Art und Weise eine wörtliche Nachsilbe in eine Zeichenfolge hinzuzufügen ist, dass Suffix in einfache Anführungszeichen anzuhängen.

the documentation to sqoop Lese macht sehr deutlich, dass eine Abfrage als ein einziges Argument übergeben werden soll, dass die wörtliche Suffix WHERE $CONDITIONS sein sollte, und dass in dem Code in der Frage gegeben, diente der Backslash nur, dass $ wörtliche zu machen. In einfachen Anführungszeichen ist jedoch die $ bereits wörtlich, was den Backslash überflüssig macht.

So:

query="select col1 col2 col3 col4 col4 from schema.table" 
query+=' WHERE $CONDITIONS' 

sqoop import --query "$query" 
+0

DANKE !!! Du hast meinen Tag gerettet. Ich habe die Abfrage + = synthax vorher nicht benutzt, es hat einfach funktioniert! – Omar

+0

Wenn Sie eine ältere Shell hätten, die '+ =' nicht unterstützt, hätten Sie übrigens 'query =" $ query "'WHERE $ CONDITIONS' verwenden können - indem Sie mit der doppelten Angabe von Zitattypen durch die Zeichenfolge gehen für den Teil, wo Sie die Erweiterungen und einfache Anführungszeichen für den Teil, wo Sie nicht möchten. 'query =" $ query WHERE \ $ CONDITIONS "' wäre auch in Ordnung. –

Verwandte Themen