1

以下のエラーを解決してください。Oracle でチェックインすると正常に動作しますが、SQOOP インポートを試行すると失敗します。

バージョン: Hadoop 0.20.2-cdh3u4 および Sqoop 1.3.0-cdh3u5

sqoop import $SQOOP_CONNECTION_STRING 
--query 'SELECT st.reference,u.unit,st.reading,st.code,st.read_id,st.avg FROM reading st,tunit `tu,unit u 
WHERE st.reference=tu.reference and st.number IN ('218730','123456') and tu.unit_id = u.unit_id 
and u.enrolled='Y' AND st.reading <= latest_off and st.reading >= To_Date('20120701','yyyymmdd') 
and st.type_id is null and $CONDITIONS' 
--split-by u.unit 
--target-dir /sample/input

エラー:

12/10/10 09:33:21 エラー manager.SqlManager: ステートメントの実行中にエラーが発生しました: java.sql.SQLSyntaxErrorException: ORA-00904: "YYYYMMDD": 無効な識別子

に続く....

12/10/10 09:33:21 エラー sqoop.Sqoop: Sqoop の実行中に例外が発生しました: java.lang.NullPointerException

ありがとうございます。それでは、お元気で、

タミル語

4

1 に答える 1

1

問題は実際には Bash 側 (またはコマンド ラインの解釈) にあると思います。たとえば、クエリには次のフラグメント u.enrolled='Y' が含まれます。一重引用符で文字定数をエスケープしていることに注意してください。クエリ全体を追加の一重引用符で囲んでいるようです: --query 'YOUR QUERY'。--query '...u.enrolled='Y'...' のような結果になります。ただし、そのような文字列は bash によって「...u.enrolled=Y...」に削除されます。「echo」を使用して、文字列が Sqoop に渡される前に bash が正確に何を行うかを確認できます。

jarcec@jarcec-thinkpad ~ % echo '...u.enrolled='Y'...'
...u.enrolled=Y..

.

クエリ内のすべての一重引用符 (\') をエスケープするか、クエリ全体で二重引用符を選択することをお勧めします。後者のオプションでは、$ 文字をバックスラッシュ (\$) でエスケープする必要があることに注意してください。

于 2012-11-14T22:27:46.350 に答える