web-dev-qa-db-fra.com

Importation Sqoop ayant une requête SQL avec la clause where

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?

9
dev ツ

Vous devez ajouter AND \$CONDITIONS

--query "select * from reason where id>20 AND \$CONDITIONS"

Veuillez vous référer à Documentation Sqoop .

19
vinayak_narune

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;
3
Nikhil Bhide

Vous pouvez utiliser la clause Where 

--where "order_status = 'CLOSED'"

https://sqoop.Apache.org/docs/1.4.2/SqoopUserGuide.html

0
RajenDharmendra

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
0
user3098458