Quelqu'un peut-il me dire quelle est l'utilisation de --split-by et de la requête limite dans sqoop?
sqoop import --connect jdbc: mysql: // localhost/my --username utilisateur --password 1234 --query 'select * from table où id = 5 AND $ CONDITIONS' --split-by table.id --target- dir/dir
--split-by: Il est utilisé pour spécifier la colonne de la table utilisée pour générer des fractionnements pour les importations. Cela signifie qu'il spécifie quelle colonne sera utilisée pour créer le fractionnement lors de l'importation des données dans votre cluster. Il peut être utilisé pour améliorer les performances d'importation en réalisant un plus grand parallélisme. Sqoop crée des fractionnements basés sur les valeurs d'une colonne particulière de la table spécifiée par --split-by par l'utilisateur via la commande d'importation. S'il n'est pas disponible, la clé primaire de la table en entrée est utilisée pour créer les divisions.
Raison d'utiliser: Parfois, la clé primaire n'a pas une distribution égale des valeurs entre les valeurs min et max (utilisée pour créer les divisions si --split-by n'est pas disponible). Dans une telle situation, vous pouvez spécifier une autre colonne disposant d'une distribution appropriée des données afin de créer des fractionnements pour des importations efficaces.
--boundary-query: Par défaut, sqoop utilisera la requête select min (), max () de pour rechercher les limites de la création de scissions. Dans certains cas, cette requête n'est pas optimale. Vous pouvez donc spécifier toute requête arbitraire renvoyant deux colonnes numériques à l'aide de l'argument --boundary-query.
Raison d'utiliser: Si --split-by ne vous donne pas les performances optimales, vous pouvez l'utiliser pour améliorer davantage les performances.
--split-by est utilisé pour répartir uniformément les valeurs de la table sur les mappeurs, c'est-à-dire que vous avez 100 enregistrements uniques (clé primaire) et s'il y a 4 mappeurs, --split-by (colonne de clé primaire) aider à distribuer votre ensemble de données de manière égale entre les mappeurs.
$ CONDITIONS est utilisé par le processus Sqoop, il sera remplacé par une expression de condition unique en interne pour obtenir l'ensemble de données . Si vous exécutez une importation parallèle, les tâches de mappage exécuteront votre requête avec des valeurs différentes substituées dans pour $ CONDITIONS. Par exemple, un mappeur peut exécuter "select bla from foo WHERE (id> = 0 AND id <10000)" et le mappeur suivant peut exécuter "select bla from foo WHERE (id> = 10000 AND id <20000)", etc. .
Sqoop vous permet d'importer des données en parallèle et --split-by et --boundary-query vous permet plus de contrôle. Si vous importez simplement une table, la clé PRIMARY sera utilisée. Toutefois, si vous effectuez une requête plus avancée, vous devrez spécifier la colonne pour effectuer la division parallèle.
c'est à dire.,
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
Requête Boundary vous permet de spécifier une requête optimisée pour obtenir le max, min. sinon, il tentera de faire MIN (a.id), MAX (a.id) SUR votre instruction --query.
Le résultat sera (si min = 0, max = 30) 3 requêtes exécutées en parallèle:
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;
De plus, si nous spécifions la valeur --query
entre guillemets doubles (""), nous devons faire précéder $CONDITIONS
d'un slash(\)
--query "select * from table where id=5 AND \$CONDITIONS"
ou sinon
--query 'select * from table where id=5 AND $CONDITIONS'
Divisé par :
En bref: Utilisé pour le partitionnement des données afin de prendre en charge le parallélisme et d'améliorer les performances