J'essaye d'utiliser l'option --query dans sqoop pour importer des données depuis SQL Server. Ma préoccupation est de savoir comment déclarer le schéma à utiliser avec --query dans SQL Server.

Mon script:

sqoop \
--options-file sqoop/aw_mssql.cfg \
--query "select BusinessEntityId, LoginID, cast(OrganizationNode as string) from Employee where \$CONDITIONS" \
--hive-table employees \
--hive-database mssql \
-- --schema=HumanResources

Produit toujours une erreur

Nom d'objet non valide «Employé»

A également essayé

--connect "jdbc:sqlserver://192.168.1.17;database=AdventureWorks;schema=HumanResources"

Mais cela a également échoué.

0
askdk 21 avril 2017 à 06:36

3 réponses

Meilleure réponse

Vous pouvez essayer ce code ci-dessous:

sqoop import \
--connect jdbc:sqlserver://192.168.1.17;database=AdventureWorks \
--username "Your User" \
--password "Your Password" \
--driver  com.microsoft.sqlserver.jdbc.SQLServerDriver \
--verbose  \
--query "select BusinessEntityId, LoginID, cast(OrganizationNode as string) from HumanResources.Employee where \$CONDITIONS" \
--split-by "EmpID" \ 
--where " EmpID='Employee ID' " \
-m 1  \
--target-dir /user/cloudera/ingest/raw/Employee\
--fields-terminated-by "," \
--hive-import \
--create-hive-table \
--hive-table mssql.employees \
  1. hive-import - Importer la table dans Hive (Utilise les délimiteurs par défaut de Hive si aucun n'est défini.)
  2. create-hive-table - Cela créera une nouvelle table HIBE. Note: Travail échouera si une table Hive existe déjà. Cela fonctionne dans ce Cas.
  3. hive-table - Spécifie <db_name>.<table_name>.
0
Souvik 21 avril 2017 à 07:15

-schema peut fonctionner conjointement avec -table, mais pas avec -query. Pensez à ce que cela signifierait, il faudrait analyser le texte de la requête et remplacer chaque référence de table non qualifiée par un nom en deux parties, mais pas des références de table qui sont déjà des noms en deux parties, trois parties ou quatre parties. Et correspondre exactement aux règles de syntaxe du back-end (SQL Server dans ce cas). Ce n'est tout simplement pas faisable.

Spécifiez le schéma explicitement dans la requête:

select BusinessEntityId, LoginID, cast(OrganizationNode as string)
from HumanResources.Employee 
where ...
0
Remus Rusanu 21 avril 2017 à 07:07

Il manque quelques éléments à la commande sqoop que vous utilisez. Tout d'abord, vous devez spécifier qu'il s'agit d'un travail d'importation sqoop. en dehors de cela, votre requête doit avoir une chaîne de connexion. De plus, je ne sais pas quels arguments vous transmettez dans le fichier d'options, donc si vous aviez publié les détails, cela aurait été plus facile et je ne suis pas sûr de la chose -- --schema=HumanResources car je ne l'ai pas vue. Un exemple de requête sqoop fonctionnel correct est:

sqoop import --connect <connection string> --username <username> --password <password> --query <query> --hive-import --target-table <table_name> -m <no_if_mappers

De plus, gardez cela à l'esprit lorsque vous utilisez l'outil --query, vous n'avez pas besoin de spécifier l'outil --table , sinon cela générera une erreur.

0
Aman Saurav 21 avril 2017 à 05:54