2016-07-25 6 views
0

версия Sqoop: 1.4.6.2.3.4.0-3485Как указать несколько условий в sqoop?

Я пытался импортировать данные с помощью sqoop с помощью следующей команды:

sqoop import -libjars /usr/local/bfm/lib/java/jConnect-6/6.0.0/jconn3-6.0.0.jar --connect jdbc:sybase:db --username user --password 'pwd' --driver com.sybase.jdbc3.jdbc.SybDriver --query 'SELECT a.* from table1 a,table2 b where b.run_group=a.run_group and a.date<"7/22/2016" AND $CONDITIONS' --target-dir /user/user/a/ --verbose --hive-import --hive-table default.temp_a --split-by id 

Я получаю следующее сообщение об ошибке:

Invalid column name '7/22/2016' 

Я попытался ограждающим запрос в двойных кавычках, но потом он говорит:

CONDITIONS: Undefined variable. 

Пробовал несколько комбинаций одиночных/двойных кавычек и избежал $ УСЛОВИЙ и с помощью переключателя --where.

PS: Условия не являются числовыми. (Он работает в тех случаях, как, где х < 10 или около того, но не в случае, когда это строка или дата)

+1

Когда вы пытались включить весь запрос в двойные кавычки и другие строки в одиночных, вы добавили обратную косую черту перед $ УСЛОВИЯМИ? Что-то вроде этого: --query «SELECT a. * (...) и a.date <'7/22/2016' AND \ $ CONDITIONS" Я читал, что вы тоже пытались избежать условий $, но это просто должно быть о различных комбинациях, которые вы пробовали. –

+0

Этот запрос работает с клиентом RDBMS: 'SELECT a. * From table1 a, table2 b где b.run_group = a.run_group и a.date <" 7/22/2016 "' –

+0

Если он работает, попробуйте '' SELECT a. * from table1 a, table2 b где b.run_group = a.run_group и a.date <'7/22/2016' AND \ $ УСЛОВИЯ ", как было предложено Jaime –

ответ

0

В вашей команде --split-by=id должен быть --split-by=a.id, я хотел бы использовать join вместо добавления дополнительных where состояние, и я бы преобразовать дату (указанное значение строки) VARCHR (с использованием Sybase конкретной функции)

sqoop import -libjars /usr/local/bfm/lib/java/jConnect-6/6.0.0/jconn3-6.0.0.jar \ 
--connect jdbc:sybase:db \ 
--username user \ 
--password 'pwd' \ 
--driver com.sybase.jdbc3.jdbc.SybDriver \ 
--query "SELECT a.* from table1 a join table2 b on a.id=b.id where a.run_group=b.run_group and convert(varchar, a.date, 101) < '7/22/2016' AND \$CONDITIONS" \ 
--target-dir /user/user/a/ \ 
--verbose \ 
--hive-import \ 
--hive-table default.temp_a \ 
--split-by a.id 
+0

Все еще не повезло. $ УСЛОВИЯ, похоже, работают с целыми условиями. Например: id <1000 в предложении where работает, но в поле даты нет. Даже сравнения строк не работают. (Ones, которые являются полями char и varchar, с использованием и без применения функции преобразования) – Outflanker

+0

может вы 'AND (1 = 1)' вместо 'AND $ CONDITIONS'? –

+0

если это не сработает - попытался найти любые существующие проблемы в sqoop для '$ CONDITIONS' - если вы не найдете ничего похожего на свою проблему, вы можете отправить билет JIRA - https://issues.apache.org/jira/browse/SQOOP-1061?jql = project% 20% 3D% 20SQOOP% 20AND% 20text% 20 ~% 20% 22% 24CONDITIONS% 22 –

0

обходной путь, который может быть использован: -options-файл

Скопируйте запрос в файле опций и используйте переключатель.

Файл параметров может быть:

--query 
select * \ 
from table t1 \ 
where t1.field="text" \ 
and t1.value="value" \ 
and $CONDITIONS 

Примечание: Не уверен, что если бы это была конкретная версия проблема или нет, но --query непосредственно в команде просто отказался работать с $ УСЛОВИЯ. (Да, я пытался избежать этого с помощью \ и нескольких других комбинаций котировок)