2016-05-05 3 views
0

Sqoop может импортировать данные из нескольких таблиц с использованием --query, но неясно, может ли он импортировать ниже запроса.Sqoop - Разделение данных

Выберите deptid, ср (оклад) из EMP группы по deptid

Другой вопрос

sqoop импорт --connect JDBC: MySQL: // MyServer: 1202/- имя пользователя = u1 --password = p1 --query 'Select * FROM EMP где EmpId < 1123 и $ УСЛОВИЯ' --split-на EmpID --target-Dir/uname/EMP/зарплату

$ УСЛОВИЯ и разделение используются для выполнения параллельной обработки или мы можем сказать, что эффективно импортировать данные. Раннее разделение строк на основе условия, а затем использование минимальной и максимальной логики для первичного ключа. В чем разница между этими двумя ($CONDITIONS, split-by). Если мы используем оба в том же заявлении sqoop, какое условие получило бы приоритет?

Спасибо ....

ответ

3

В вашем понимании есть пробел.

Прежде всего, степень параллелизма контролируется -m <n> или --num-mappers <n>. По умолчанию значение --num-mappers равно 4.

Во-вторых, --split-by <column-name>, разделит вашу задачу на основе имени столбца.

В-третьих, $CONDITIONS, он используется внутри sqoop для достижения этой задачи разделения.

Пример, Вы произвели запрос:

sqoop import --connect jdbc:mysql://myserver:1202/ --username u1 --password p1 --query 'select * from emp where $CONDITIONS' --split-by empId --target-dir /temp/emp -m 4

Say, мой EmpId равномерно распределенную из 1- 100.

Теперь, sqoop примет --split-by колонку и найти его max и min значение с использованием запроса:

SELECT MIN(empId), MAX(empId) FROM (Select * From emp WHERE (1 = 1)) t1

Смотрите его заменить $CONDITIONS с (1 = 1).

В нашем случае, не менее, максимальные значения равны 1 и 100.

В число картографов являются 4, sqoop разделит мой запрос в 4-х частях.

Создание входного разделить с нижней границей 'EmpId> = 1' и верхней границей 'EmpId < 25'

Созданием входного раскола с нижней гранью 'EmpId> = 25' и верхней границей 'EmpId < 50'

Создание входного разделить с нижней границей 'EmpId> = 50' и верхней границей 'EmpId < 75'

Созданием входного раскола с нижней гранью 'EmpId> = 75' и верхней границей 'EmpId < = 100'

Теперь $CONDITIONS снова появится на картинке. Он заменяется запросами выше диапазона.

Первый преобразователь будет срабатывать запрос, как это:

Select * From emp WHERE empId >= 25' AND 'empId < 50

и так далее для остальных 3-картографов.

Результаты всех картографов агрегируются и записываются в конечный каталог HDFS.

Что касается вашего запроса:

select deptid, avg(salary) from emp group by deptid

укажешь

--query 'select deptid, avg(salary) from emp group by deptid where $CONDITIONS'

Это будет первый преобразованы в

select deptid, avg(salary) from emp group by deptid where (1 = 0)

для извлечения метаданных столбца.

Я считаю, что этот запрос не будет работать в СУБД. Попробуйте выполнить запрос (с Where (1 = 0)) непосредственно в Mysql.

Таким образом, вы не сможете использовать этот запрос для извлечения данных с использованием Sqoop.

Sqoop используется для более простых SQL-запросов.

+0

Спасибо Dev ... Пожалуйста, также мои 1 вопрос. Если я правильно понял и запрос имел условие, подобное empid <200, а нет карточек 4, он разбил данные в (1-49), (50-99), (100-149), (150-200) все включено. что если первичный ключ не распределяется равномерно, и в таблице нет такого ключа. Будет ли он использовать концепцию выборки в этом случае? – Ajay

+0

@ Ajay вы можете указать любой столбец в '--split-by' (_not обязательно ** первичный ключ ** _). Но рекомендуется использовать нестрочные столбцы. –

+0

Спасибо Dev .... Действительно полезно. Можем ли мы импортировать данные? Выберите deptid, avg (зарплата) из emp group by deptid', используя это заявление? Как sqoop равномерно распределяет работу со всеми картографами в случае, когда значение не равномерно? – Ajay

1

Ваш запрос, 'Выберите * из emp где empid < 1123 и $ CONDITIONS', отлично работает для импорта данных из РСУБД в HDFS.

Несмотря на то, что $ УСЛОВИЯ сначала оценивает значение 1 = 0 в предложении where, если вы видите журнал импорта Sqoop на консоли, вы фактически увидите другой запрос границы SQL Val, который заменяет $ CONDITIONS на 1 = 1, который пройдет запрос, и, следовательно, данные могут быть импортированы.

Обратите внимание, что Sqoop CAN может импортировать даже средние сложные SQL-запросы, такие как объединения.Я не уверен, может ли он поддерживать очень сложные SQL-запросы, хотя я сам его не тестировал.