2017-02-08 63 views
0

我是比較新的sqooping的過程,所以赦免任何無知。我一直在嘗試將數據源中的表格作爲鑲木地板文件進行拼接,並創建一個impala表格(也稱爲鑲木地板),並將插入sqooped數據。代碼運行沒有問題,但是當我嘗試選擇測試一對夫婦行我得到的錯誤:sqoop創建impala實木複合地板表

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

我鏡像我在Cloudera的蒞臨指導過程中發現:https://www.cloudera.com/documentation/enterprise/5-8-x/topics/impala_create_table.html。主要是「內部和外部表」部分。我一直試圖避免必須使用特定的parquet文件來推斷模式,因爲這整個事情每個月都會用bash腳本啓動(而且我也想不出一種方法將它指向一個文件如果我使用多個映射器)。

這是我使用的代碼。我覺得我要麼失去了一些小而愚蠢的東西,要麼我把所有重大事情搞砸了,卻沒有意識到這一點。任何和所有幫助表示讚賞。謝謝!

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

您也可以考慮使用選項'--hive-import',它立即創建帶有底層parquet文件的配置表格,而不必擔心。 Impala使用相同的表Metastore,因此沒有問題。 – spijs

+0

@spijs謝謝你的建議!這是否會在Impala中自動存在一次sqooped或是否必須進入Hue> Impala並刷新Metastore?由於我們正在爲業務合作伙伴創建這一步驟,因此任何手動步驟都是不可行的。 – kemri

+0

你確實必須刷新元存儲。你還需要表名來創建表,所以在你的腳本中添加一個impala命令可能比例如定義所有不需要的列的作用要小一些,這對於-hive-import – spijs

回答

0

按在我提供如何您可以用--hive-import實現使用一個sqoop進口相同的例子的評論請求。由於顯而易見的原因,我沒有針對您的具體要求對其進行測試,因此可能需要進行一些更多的調整,而這些sqoop命令通常就是這種情況。 根據我的經驗,作爲實木複合材料導入時使用--query選項,因爲它不允許使用schema.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 

基本上你需要什麼--hive-import--hive-database--hive-table--query。 如果您不希望您的所有列在蜂巢出現串還必須包括:

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

您可能需要一個類似--map-java-columns爲好,但我從來不知道什麼時候,這是必需的。 如果您需要多個映射器,您將需要一個--split-by

正如評論中所述,您將需要使用invalidate metadata db.table來確保Impala看到這些更改。您可以從CL或單個bash腳本發出這兩個命令,您可以使用impala-shell -q [query]發出impala命令。

+0

非常感謝您的解釋和演練!我會盡快對此進行測試。 – kemri

+0

爲--hive數據庫參數,當你說「數據庫你想使用」,這是否意味着我們試圖從sqoop或其他東西的oracle數據庫的名稱? – kemri

+0

配置單元Metastore數據庫的名稱。不是源db – spijs