В вашем понимании есть пробел.
Прежде всего, степень параллелизма контролируется -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-запросов.
Спасибо Dev ... Пожалуйста, также мои 1 вопрос. Если я правильно понял и запрос имел условие, подобное empid <200, а нет карточек 4, он разбил данные в (1-49), (50-99), (100-149), (150-200) все включено. что если первичный ключ не распределяется равномерно, и в таблице нет такого ключа. Будет ли он использовать концепцию выборки в этом случае? – Ajay
@ Ajay вы можете указать любой столбец в '--split-by' (_not обязательно ** первичный ключ ** _). Но рекомендуется использовать нестрочные столбцы. –
Спасибо Dev .... Действительно полезно. Можем ли мы импортировать данные? Выберите deptid, avg (зарплата) из emp group by deptid', используя это заявление? Как sqoop равномерно распределяет работу со всеми картографами в случае, когда значение не равномерно? – Ajay