2017-02-08 3 views
0

Ich bin relativ neu der Prozess des Sqooping so entschuldigen Sie jede Ignoranz. Ich habe versucht, eine Tabelle aus einer Datenquelle als eine Parkettdatei zu stützen und eine Impala-Tabelle (auch als Parkett) zu erstellen, in die ich die gecloopten Daten einfügen werde. Der Code läuft ohne ein Problem, aber wenn ich versuche, ein paar Zeilen für die Prüfung auszuwählen erhalte ich die Fehlermeldung:sqoop erstellen impala Parketttisch

.../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] 

Ich war Spiegelung der Prozess, den ich hier auf einem cloudera Führer gefunden: https://www.cloudera.com/documentation/enterprise/5-8-x/topics/impala_create_table.html. Hauptsächlich der Abschnitt "Interne und externe Tabellen". Ich habe versucht, zu vermeiden, das Schema mit einer bestimmten Parkett-Datei ableiten zu müssen, da diese ganze Sache jeden Monat mit einem Bash-Skript gestartet wird (und ich kann mir auch keine Möglichkeit vorstellen, es auf nur eine Datei zu verweisen wenn ich mehr als einen Mapper verwende).

Hier ist der Code, den ich verwendet habe. Ich habe das Gefühl, dass ich entweder etwas Kleines und Dummes vermisse, oder dass ich alles Wichtige vermasselt habe, ohne es zu merken. Jede und jede Hilfe wird geschätzt. Vielen Dank!

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

Sie können auch die Option '--hive-import' verwenden, die sofort Hive-Tabellen mit zugrunde liegenden Parkett-Dateien erstellt, ohne dass Sie sich Sorgen machen müssen. Impala verwendet den gleichen Tabellenmetastor, also keine Probleme. – spijs

+0

@spijs danke für den Vorschlag! Würde das automatisch in Impala existieren, sobald es sqooped ist oder müsste ich nach Hue> Impala gehen und den Metastore auffrischen? Jede Menge manueller Schritte ist ein Nein, da wir dies für Geschäftspartner erstellen. – kemri

+0

Sie müssten in der Tat den Meta-Store aktualisieren. Sie brauchen auch den Tabellennamen, um die Tabelle zu erstellen, daher ist das Hinzufügen eines Implana-Befehls zu Ihrem Skript wahrscheinlich weniger Arbeit als zum Beispiel das Definieren all Ihrer Spalten, was nicht notwendig ist mit -hive-import – spijs

Antwort

0

Wie pro Antrag in den Kommentaren biete ich ein Beispiel, wie Sie das gleiche mit einem Sqoop Import mit --hive-import erreichen könnte. Aus offensichtlichen Gründen habe ich es nicht für Ihre spezifischen Anforderungen getestet, so dass es etwas mehr Abstimmung benötigen könnte, was häufig mit diesen sqoop-Befehlen der Fall ist. Nach meiner Erfahrung zwingt Sie das Importieren als Parkett dazu, die Option --query zu verwenden, da Sie es nicht erlauben, schema.table als Tabelle zu verwenden.

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 

Im Grunde, was Sie brauchen, ist --hive-import--hive-database, --hive-table und --query. Wenn Sie nicht wollen, alle Spalten in Hive als Strings erscheinen müssen Sie schließen auch ein:

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

Genauso gut könnte man eine ähnliche --map-java-columns brauchen, aber ich bin nie sicher, wenn dies erforderlich ist. Sie benötigen eine --split-by, wenn Sie mehrere Mapper

möchten Wie in den Kommentaren besprochen, müssen Sie invalidate metadata db.table verwenden, um sicherzustellen, dass Impala diese Änderungen sieht. Sie könnten beide Befehle von CL oder einem einzelnen Bash-Skript ausgeben, wo Sie den Impala-Befehl mit impala-shell -q [query] ausgeben können.

+0

Vielen Dank für die Erklärung und die Walkthrough! Ich werde das testen, sobald es mir möglich ist. – kemri

+0

für den Parameter --hive-database, wenn Sie sagen "Datenbank, die Sie verwenden möchten", bedeutet dies den Namen der Orakel db wir versuchen, von oder etwas anderes shooop? – kemri

+0

Der Name der Metapherdatenbank des Bienenstocks. nicht die Quelle db – spijs