2013-07-29 3 views
9

Может ли кто-нибудь сказать мне, что использовать -split-by и граничный запрос в sqoop?Каковы следующие команды в sqoop?

sqoop импорт --connect JDBC: MySQL: // локальный/мой --username пользователь --password 1234 --query 'выберите * из таблицы, где ID = 5 и $ УСЛОВИЯ' --split-таблицей .id --target-dir/dir

ответ

28

--split-по: Он используется для указания столбца таблица, используемая для генерации разделов для импорта. Это означает, что он указывает, какой столбец будет использоваться для создания разделения при импорте данных в ваш кластер. Его можно использовать для повышения эффективности импорта путем достижения большего параллелизма. Sqoop создает разбиения на основе значений в определенном столбце таблицы, который задается пользователем -split-by пользователем через команду импорта. Если он недоступен, первичный ключ таблицы ввода используется для создания разделов.

Причина использования: Иногда первичный ключ не имеет равномерного распределения значений между значениями min и max (которые используются для создания разделов, если --split-by недоступно). В такой ситуации вы можете указать другой столбец, который имеет правильное распределение данных для создания разделов для эффективного импорта.

--boundary-запрос: По умолчанию sqoop будет использовать запрос, выберите мин(), MAX() из выяснить границы для создания расколов. В некоторых случаях этот запрос не самый оптимальный, поэтому вы можете указать любой произвольный запрос, возвращающий два числовых столбца, используя аргумент --граничный запрос.

Причина использования: Если --split-by не дает вам оптимальной производительности, вы можете использовать это, чтобы улучшить производительность.

10

Sqoop позволяет вам импортировать данные параллельно, а -split-by и -граничный-запрос позволяет вам больше контролировать. Если вы просто импортируете таблицу, тогда он будет использовать PRIMARY KEY, но если вы выполняете более продвинутый запрос, вам нужно указать столбец для параллельного разделения.

т.е.

sqoop import \ 
    --connect 'jdbc:mysql://.../...' \ 
    --direct \ 
    --username uname --password pword \ 
    --hive-import \ 
    --hive-table query_import \ 
    --boundary-query 'SELECT 0, MAX(id) FROM a' \ 
    --query 'SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND $CONDITIONS'\ 
    --num-mappers 3 
    --split-by a.id \ 
    --target-dir /data/import \ 
    --verbose 

Boundary Query позволяет определить оптимизированный запрос для получения максимального, мин. иначе он попытается выполнить MIN (a.id), MAX (a.id) в вашем запросе -query.

Результаты будут (если мин = 0, макс = 30) 3 запросы, которые получают выполняются параллельно:

SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 0 AND 10; 
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 11 AND 20; 
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 21 AND 30; 
+0

Извините. Я все еще не понимаю. Что такое -split-by? похоже, что-то связано с обработкой команды? – DrewRose

16

--split-на используется для распределения значений из таблицы через мапперов равномерно т.е. сказать, и есть 100 уникальных записей (первичный ключ), и если есть 4 мапперы, --split-на (первичный ключ столбца) поможет равномерно распределить ваши данные среди картографов.

$ УСЛОВИЯ Используется процессом Sqoop, он будет заменять собой выражение уникального условия внутри, чтобы получить набор данных. Если вы выполняете параллельный импорт, задачи карты будут выполнять ваш запрос с разными значениями, замененными для $ УСЛОВИЙ. например, один картограф может выполнять «select bla из foo WHERE (id> = 0 AND id < 10000)», а следующий обработчик может выполнить «select bla from foo WHERE (id> = 10000 AND id < 20000)» и т. д. ,

1

Кроме того, если мы указываем --query значение в двойные кавычки (»«), мы должны предшествовать $CONDITIONS с slash(\)

--query "select * from table where id=5 AND \$CONDITIONS" 

или еще

--query 'select * from table where id=5 AND $CONDITIONS' 
0

--split-на пункта используется для указания столбцов таблицы, которые используются для генерации разделов для импорта данных. В этом разделе указаны столбцы, которые будут использоваться для разделения при импорте данных в кластер Hadoop. Операция -split-by помогает достичь улучшенной производительности благодаря большему параллелизму. Apache Sqoop создаст разбиения на основе значений, присутствующих в столбцах, указанных в предложении -split-by команды import. Если условие -split-by не указано, первичный ключ таблицы используется для создания разделов при импорте данных. Время от времени первичный ключ таблицы может не иметь равномерно распределенных значений между минимальным и максимальным диапазонами. В таких обстоятельствах -split-by может использоваться для указания некоторого другого столбца, который имеет даже распределение данных для создания разделов, чтобы эффективно импортировать данные.

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