2017-05-02 8 views
0

bashスクリプト内で引数をSqoopに渡す際に問題が発生しました。Sqoopでの可変解釈のエラー

Sqoopは、RDB(この特定のケースではOracle)からHiveにテーブルを転送するためのツールです。私は、スクリプト内で起動するコマンドを生成する値は、ファイルを形成し、awkのでそれらを解析取ってい

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

:それは、コマンドラインツールは、このようにして起動します。
--queryを除くすべての引数はokです。この引数は、データ抽出のためにソースで使用するクエリを渡すために使用されます。

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

$条件\それはこの非常にリテラル形式で必須ですSqoop代替、ので、バックスラッシュが含まれる変数である:それはこの形式を受け入れます。

私はこのスクリプトをそのまま実行しても、--queryの値をプレーンテキストでハードコーディングするので、問題は--queryパラメータであると確信しています。

明確にするために、これは私が私のスクリプト内で持っているコマンドです:だから

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

、私は理解していない理由は、この値に問題があります。成功することなく、これらの

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 

すべて:考える

::私はすでに試した

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


は、これまでのところ私は、これらの値は、--queryを形成しようとしました。
私を助けてくれませんか?私は立ち往生している。

おかげ

+0

は 'bashの-x yourscript'が、それは' sqoop'ラインを起動する方法を示し、そして '(-x'設定し実行した後、手で作業ラインを自分で実行しているののログの両方を提供します**と**成功したコマンドライン呼び出しの 'set -x'出力が含まれているので、シェルがどのように解釈しているかがわかります)。 –

+0

(「普通のテキストで '--query'の値をハードコーディングする」と言うと、あなたが何の引用をしているのかはまったく分かりません。 –

+0

@CharlesDuffyあなたができるだけ早く尋ねた情報を提供します。ハードコーディングとは、変数を使用せずに、実際にselect文をプレーンテキストで記述することを意味します。つまり、 '--query select col1 col2 col3 from schema.table where \ $ CONDITIONS' – Omar

答えて

0

文字列リテラルのサフィックスを追加する簡単な方法は、単一引用符でその接尾辞を付加することです。 the documentation to sqoopを読む

は、それは非常に明確なクエリがリテラルのサフィックスはWHERE $CONDITIONSなければならないことを、1つの引数として渡す必要があり、そしてそれが問題に与えられたコードでは、バックスラッシュは、それだけで$リテラルにするために役立っていることになります。しかし、一重引用符では、$はすでにリテラルなので、バックスラッシュは不要です。したがって

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

sqoop import --query "$query" 
+0

ありがとうございます!あなたは私の一日を救った。私は前にクエリ+ = synthaxを使用していない、それは正常に働いた! – Omar

+0

'+ ='をサポートしていない古いシェルがあった場合、 'query =" $ query "'WHERE $ CONDITIONS' 'を使うことができます。あなたが展開したい部分と、そうでない部分を一重引用符で囲みます。 'query =" $ query WHERE \ $ CONDITIONS "'でも良いでしょう。 –