sqoop import --connect jdbc:teradata://192.168.xx.xx/DBS_PORT=1025,DATABASE=ds_tbl_db
--driver com.teradata.jdbc.TeraDriver
--username dbc
--password dbc
--query 'select * from reason where id>20'
--Hive-import
--Hive-table reason_Hive
--target-dir <hdfs-location>
-m 1
J'ai eu l'erreur:
La requête [select * from raison où id> 20] doit contenir '$ CONDITIONS' dans la clause WHERE.
Je sais qu'il doit y avoir une clause where dans la requête pour Sqoop.
Donc, pour des requêtes comme
select * from reason
Je le modifie pour:
select * from reason WHERE $CONDITIONS
Que faire pour les requêtes ayant la clause where
?
Vous devez ajouter AND \$CONDITIONS
--query "select * from reason where id>20 AND \$CONDITIONS"
Veuillez vous référer à Documentation Sqoop .
Sqoop nécessite d’accéder aux métadonnées de la table pour obtenir des informations sur le type de colonne, par exemple. L'espace réservé $ CONDITIONS est défini par défaut sur '1 = 0' pour garantir à Que sqoop ne reçoit que des informations de type. Ainsi, après l'exécution de la commande sqoop, la première requête renvoyée est Avec la valeur par défaut $ CONDITIONS. Par la suite, il est remplacé par différentes valeurs définissant différentes plages en fonction du nombre de mappeurs (-m) ou --split-by column ou --boundary-query afin que l'ensemble du jeu de données puisse être divisé en différentes tranches de données ou en morceaux et en morceaux. peuvent être importés en parallèle avec autant que la simultanéité disponible. Sqoop remplacera automatiquement cet espace réservé par les conditions générées spécifiant quelle tranche de données doit être transférée par chaque tâche.
Par exemple, considérons la table sample_data avec les colonnes nom, id et salaire . Vous voulez récupérer les enregistrements avec un salaire> 1k.
sqoop import \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
--username retail_dba --password cloudera \
--query 'select * from sample_data where $CONDITIONS AND salary > 1000' \
--split-by salary \
--target-dir hdfs://quickstart.cloudera/user/cloudera/sqoop_new
Voici la première requête qui renvoie un ensemble vide.
SqlManager: Executing SQL statement: select * from sample_data where (1 = 0) AND salary > 1000
Ensuite, la requête suivante consiste à obtenir les valeurs min et max.
INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(salary), MAX(salary) FROM (select * from sample_data where (1 = 1) AND salary > 1000) AS t1;
Vous pouvez utiliser la clause Where
--where "order_status = 'CLOSED'"
Je travaille dans cloudera
avec l'interrogation d'une liste de tables dans Mysql
.
J'ai obtenu les résultats avec la requête ci-dessous:
sqoop import --connect jdbc:mysql://127.0.0.1/Mydatabase
--username root --password cloudera
--query 'select * from employee where $CONDITIONS AND Sal<250000'
--split-by Sal --target-dir=user/cloudera/myfirstdata2 -m 1