2016-09-03 2 views
0

У меня есть таблица dept_nopk. эта таблица имеет два столбца: department_id и department_name, и в этой таблице нет первичного ключа. Я пытаюсь импортировать эту таблицу в HDFS, используя следующую команду SQOOP.

sqoop import \ 
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" 
--username useranem 
--password pass 
--query "select * from dept_nopk where department_id <> 1000" 
--target-dir /user/cloudera/departments 
-m 1 

но дает следующее сообщение об ошибке:

java.io.IOException: query[select * from dept_nopk where department_id <> 1000] must contain $CONDITION in where clause 

Мои вопросы сейчас:

1) Почему я получаю эту ошибку, когда я уже указал, что количество карт просто 1? нужно ли положить $CONDITION в мой where пункт?

2) Во второй раз я изменил мой запрос следующим образом

sqoop import \ 
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" 
--username useranem 
--password pass 
--query "select * from dept_nopk where \$CONDITIONS" 
--target-dir /user/cloudera/departments 
--where "department_id <> 8000"    
-m 1 

Я использовал --where для department_id<>8000 и конкретизированы \$CONDITIONS. Теперь я не получил никакой ошибки, но в результатах он импортировал строки с department_id =8000, т. Е. Полностью игнорировал аргумент --where. Зачем?

3) Я пробовал следовать, и он отлично работал.

sqoop import \ 
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" 
--username useranem 
--password pass 
--query "select * from dept_nopk where department_id <> 8000 and \$CONDITIONS" 
--target-dir /user/cloudera/departments   
-m 1 

Не могли бы вы объяснить причину ошибок, описанных в пунктах 1) и 2?

ответ

1

Question 1

Добавление $CONDITION является обязательным в Sqoop даже с 1 картографа, поскольку Sqoop преобразование запросов 1 картографа как -

Для извлечения метаданных:

select * from dept_nopk where 1 = 0 

заменяющий \$CONDITIONS с 1 = 0

для извлечения всех данных:

select * from dept_nopk where 1 = 1 

заменяет \$CONDITIONS с 1 = 1

Question 2

Проверить аналогичный вопрос: SQOOP --where is not working with --query

+0

Спасибо, ваши ответы полезны. –

1

* - где взаимоисключающие --query (так игнорируется, если включен) [Логически, ур добавления - -query, чтобы добавить вашу информацию о том, где находится caluse]

* $ УСЛОВИЯ НЕ относятся к вашим условиям (где предложение). Он (требуется в --query и) используется внутри, чтобы распараллелить результаты, даже если mappers больше 1. Он работает с аргументом -split-by.

Смежные вопросы