2015-09-17 4 views
3

У меня есть проблема с двойными кавычками по этому sqoop запрос:Sqoop: двойные кавычки запрос

select i.Number, i.Date,i.Station, i.lStation, 
count(*) ax, “1- Pd” St , b.Type 
from Leg jl, yLeg i, senger b, 
where jl.LegID = i.LegID and jl.rID = b.erID and b.gID = b.ID 
and b.tus not in (1,4) group by Number, Date, tion, b.Type 

как я могу исправить? с некоторым параметром выхода

+0

Вы пробовали использовать одинарные кавычки ''? – Dane

+0

у вас есть дополнительный ',' в разделе 'from' –

+0

это и пример, реальная проблема - это« 1- Pd »St. С другой стороны, я пробовал использовать« 1- Pd »St,» 1- Pd «St», «1-Pd» «St» все комбинации с котировками –

ответ

0

В этом вопросе есть две части.

Первый - это действительный запрос для вашей исходной базы данных? В большинстве баз данных есть какой-то клиент или оболочка, которые позволяют вводить и выполнять запросы. Ваш запрос должен быть действительным в отношении оболочки или клиента.

Вторая часть вашего вопроса: как вы берете этот запрос (как String) и передаете его в базу данных через sqoop. Ответ на этот вопрос заключается в том, как вы работаете в sqoop.

Если вы используете sqoop через командную строку, вам необходимо идентифицировать эти символы (обычно двойные кавычки), которые придают вашей ОС возможность встраивания в аргумент командной строки. Используйте обратную косую черту перед этими символами, чтобы помочь ОС правильно разобрать команду. Обычно вам нужно поместить всю строку запроса в неэкранированные двойные кавычки, чтобы ОС рассматривала ваш запрос как один строковый аргумент.

Если вы работаете sqoop через Oozie то я настоятельно рекомендую вам разбить команду Sqoop в аргументы в действии Sqoop:

<arg>--query</arg> 
<arg>select ... count(*) ax, “1- Pd” St , b.Type ... WHERE $CONDITIONS</arg> 

Так что вы можете вообще вставить свой запрос, как это в действии.

Конечно, нет ничего проще. Вы все еще должны помнить, что запрос находится внутри XML-документа, поэтому любой символ, который испортит разбор XML, станет проблематичным. Единственными символами, с которыми я столкнулся до сих пор, являются угловые скобки, и я использую замену свойств (немного для kludge, я допускаю), чтобы решить эту проблему:

В файле свойств рабочего процесса Oozie, который я поставил:

lessThan=< 

и я изменю свое ARG из

<arg>SELECT * from MyTable where $CONDITIONS AND (SOME_COL < 1000)</arg> 

в

<arg>SELECT * from MyTable where $CONDITIONS AND (SOME_COL ${lessThan} 1000)</arg> 

EDIT:

Для тех из вас, кто не нравится мой кладж, вы можете попробовать использовать CDATA элемент «бежать» ничего в запросе (за исключением, конечно, «]]>»):

<arg><![CDATA[SELECT * from MyTable where $CONDITIONS AND (SOME_COL < 1000)]]></arg> 
0

Сначала отлаживайте запрос командой sqoop eval -libjars /var/lib/sqoop/ojdbc6.jar --connect jdbc:oracle:thin:@hostname:portnumber/servicename --username user -password password --query "select * from schemaname.tablename where rownum=10", введите свой запрос в «запрос» и посмотрите, генерирует ли фактический запрос ожидаемый результат? вы можете видеть вывод в самом терминале.

Если запрос дают результаты, как вы ожидали, используйте следующую команду sqoop , чтобы импортировать таблицу

sqoop import -libjars /var/lib/sqoop/ojdbc6.jar --connect 'jdbc:oracle:thin:@hostname/service_name' --username user -password password -m 1 --hive-overwrite --hive-import --hive-database database_name --hive-table table_nmae --target-dir '/user/hive/warehouse/databasename.db/tablename' --query "select * from source_database.source_tablename WHERE 1=1 AND \$CONDITIONS" 

Точной проблему с двойными кавычками стоящими перед вами могут быть решены с помощью ключа побега.Пожалуйста, нас WHERE 1 = 1 AND \ $ УСЛОВИЯ как есть и вставьте ваш запрос перед ГДЕ в команде sqoop.

Если вы столкнулись с какой-либо ошибкой, вставьте ошибку, вам нужно добавить другую клавишу эвакуации, чтобы избежать двойных кавычек.