2017-02-08 1 views
0

Je suis relativement nouveau le processus de Socooping pardon toute ignorance. J'ai essayé de faire une boucle sur une table à partir d'une source de données en tant que fichier parquet et de créer une table d'impala (également en parquet) dans laquelle j'insérerai les données du pavé. Le code fonctionne sans problème, mais lorsque je tente de sélectionner une des lignes de couple pour le test je reçois l'erreur:sqoop créer impala parquet table

.../EWT_CALL_PROF_DIM_SQOOP/ec2fe2b0-c9fa-4ef9-91f8-46cf0e12e272.parquet' has an incompatible Parquet schema for column 'dru_id.test_ewt_call_prof_dim_parquet.call_prof_sk_id'. Column type: INT, Parquet schema: optional byte_array CALL_PROF_SK_ID [i:0 d:1 r:0] 

j'étais le processus que je reflète sans trouvé sur un guide de Cloudera ici: https://www.cloudera.com/documentation/enterprise/5-8-x/topics/impala_create_table.html. Principalement la section "Tables internes et externes". J'ai essayé d'éviter d'avoir à inférer le schéma avec un fichier parquet particulier, puisque tout cela sera lancé tous les mois avec un script bash (et je ne peux pas non plus trouver un moyen de le pointer vers un seul fichier si j'utilise plus d'un mappeur).

Voici le code que j'ai utilisé. J'ai l'impression que je manque quelque chose de petit et de stupide, ou que j'ai tout gâché sans m'en rendre compte. Toute aide a été appréciée. Merci!

sqoop import -Doraoop.import.hint=" " \ 
    --options-file /home/kemri/pass.txt \ 
    --verbose \ 
    --connect jdbc:oracle:thin:@ldap://oid:389/cn=OracleContext,dc=[employer],dc=com/EWSOP000 \ 
    --username [userid] \ 
    --num-mappers 1 \ 
    --target-dir hdfs://nameservice1/data/res/warehouse/finance/[dru_userid]/EWT_CALL_PROF_DIM_SQOOP \ 
    --delete-target-dir \ 
    --table DMPROD.EWT_CALL_PROF_DIM \ 
    --direct \ 
    --null-string '\\N' \ 
    --null-non-string '\\N' \ 
    --as-parquetfile 


impala-shell -k -i hrtimpslb.[employer].com 


create external table test_EWT_CALL_PROF_DIM_parquet(
CALL_PROF_SK_ID INT, 
SRC_SKL_CD_ID STRING, 
SPLIT_NM STRING, 
SPLIT_DESC STRING, 
CLM_SYS_CD STRING, 
CLM_SYS_NM STRING, 
LOB_CD STRING, 
LOB_NM STRING, 
CAT_IND STRING, 
CALL_TY_CD STRING, 
CALL_TY_NM STRING, 
CALL_DIR_CD STRING, 
CALL_DIR_NM STRING, 
LANG_CD STRING, 
LANG_NM STRING, 
K71_ATOMIC_TS TIMESTAMP) 
stored as parquet location '/data/res/warehouse/finance/[dru_userid]/EWT_CALL_PROF_DIM_SQOOP'; 
+0

Vous pouvez également utiliser l'option '--hive-import' qui crée immédiatement des tables de ruche avec des fichiers parquet sous-jacents sans que vous ayez à vous inquiéter. Impala utilise le même métastore de table donc pas de problème. – spijs

+0

@spijs merci pour cette suggestion! Est-ce que cela existerait automatiquement dans Impala une seule fois ou devrais-je aller dans Hue> Impala et rafraîchir le métastore? N'importe quelle quantité d'étapes manuelles est un échec puisque nous créons cela pour les partenaires commerciaux. – kemri

+0

Vous auriez en effet besoin d'actualiser le méta-store. Vous aurez également besoin du nom de table pour créer la table afin d'ajouter une commande impala à votre script est probablement moins de travail que par exemple définir toutes vos colonnes ce qui n'est pas nécessaire avec - -hive-import – spijs

Répondre

0

selon la demande dans les commentaires que je donne un exemple de la façon dont vous pouvez obtenir le même en utilisant une importation Sqoop avec --hive-import. Pour des raisons évidentes, je ne l'ai pas testé pour vos besoins spécifiques, il pourrait donc avoir besoin de plus de réglage, ce qui est souvent le cas avec ces commandes sqoop. Dans mon expérience d'importation en tant que parquet vous oblige à utiliser l'option --query car il ne vous permet pas d'utiliser schema.table comme table.

sqoop import -Doraoop.import.hint=" "\ 
--verbose \ 
--connect jdbc:oracle:thin:@ldap://oid:389/cn=OracleContext,dc=[employer],dc=com/EWSOP000 \ 
--username [userid] \ 
-m 1 \ 
--password [ifNecessary] \ 
--hive-import \ 
--query 'SELECT * FROM DMPROD.EWT_CALL_PROF_DIM WHERE $CONDITIONS' \ 
--hive-database [database you want to use] \ 
--hive-table test_EWT_CALL_PROF_DIM_parquet \ 
--target-dir hdfs://nameservice1/data/res/warehouse/finance/[dru_userid]/EWT_CALL_PROF_DIM_SQOOP \ 
--null-string '\\N' \ 
--null-non-string '\\N' \ 
--as-parquetfile 

Fondamentalement, ce que vous avez besoin pour --hive-import est --hive-database, --hive-table et --query. Si vous ne voulez pas toutes vos colonnes apparaissent dans Hive sous forme de chaînes, vous devez également inclure:

--map-hive-columns [column_name1=Timestamp,column_name2=Int,...] 

Vous pourriez avoir besoin d'une --map-java-columns similaire, mais je ne suis jamais sûr quand cela est nécessaire. Vous aurez besoin d'un --split-by si vous voulez plusieurs mappeurs

Comme discuté dans les commentaires, vous devrez utiliser invalidate metadata db.table pour vous assurer que Impala voit ces changements. Vous pouvez émettre les deux commandes depuis CL ou un seul script bash où vous pouvez lancer la commande impala en utilisant impala-shell -q [query].

+0

Merci beaucoup pour l'explication et la procédure pas à pas! Je vais tester cela dès que possible aujourd'hui. – kemri

+0

pour le paramètre --hive-database, quand vous dites "base de données que vous voulez utiliser", cela signifie-t-il le nom de la base de données oracle que nous essayons d'utiliser ou de quelque chose d'autre? – kemri

+0

Nom de la base de données métastore de la ruche. pas la source db – spijs