каковы следующие команды в sqoop?

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

импорт sqoop --connect jdbc: mysql:/ / localhost / my --username user --password 1234 --query 'select * from table where id=5 AND $CONDITIONS' --split-by table.id --target-dir /dir

5 ответов


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

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

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

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


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

$условия используется процессом Sqoop, он заменит уникальное выражение условия внутри, чтобы получить набор данных. Если вы запустите параллельный импорт, задачи карты выполнят запрос с различными значениями, замененными на $CONDITIONS. например, один картограф может выполнить "select bla from foo WHERE (id >=0 и id = 10000 и id


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

то есть,

  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

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

результаты будут (если min=0, max=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;

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

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

или

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

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