2017-02-08 7 views
0

저는 상대적으로 새로운 sqooping 과정이므로 아무런 사안도 용서하지 못합니다. 필자는 마루 파일로 데이터 소스에서 테이블을 스퀘어로 만들려고하고 sqooped 데이터를 삽입 할 임 팔라 테이블 (또한 마루로)을 만듭니다. 코드는 문제없이 실행,하지만 테스트를 위해 몇 행을 선택하려고 할 때 오류 얻을 : https://www.cloudera.com/documentation/enterprise/5-8-x/topics/impala_create_table.html :sqoop은 임팔라 나무 마루 테이블을 만듭니다

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

은 내가 여기 클라우 데라 가이드에있는 프로세스를 미러링되었다. 주로 "내부 및 외부 테이블"섹션. 나는이 모든 것이 bash 스크립트로 매달 쫓겨날 것이기 때문에 특정 파루 파일로 스키마를 추론하는 것을 피하려고 노력 해왔다. (또한 나는 하나의 파일을 가리키는 방법을 생각할 수도 없다. 하나 이상의 매퍼를 사용하는 경우).

다음은 내가 사용한 코드입니다. 나는 작고 어리석은 것을 놓치고있는 것처럼 느껴진다. 또는 나는 그것을 깨닫지 못하고 모든 일을 망쳐 버렸다. 모든 도움을 주셨습니다. 감사! 난 당신이 --hive-import와 같은 사용하여 하나 Sqoop을 가져 오기를 얻을 수있는 방법의 예를 제공 코멘트의 요청에 따라

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' 옵션을 사용하여 걱정하지 않아도 즉시 기본 밑단 파일로 하이브 테이블을 생성 할 수도 있습니다. 임팔라는 동일한 테이블 저장소를 사용하므로 문제가 없습니다. – spijs

+0

@spijs 제안에 감사드립니다! 한 번 sqooped 임팔라이 자동으로 존재하거나 색조> 임팔라 가서 metastore 새로 고쳐야겠습니까? 비즈니스 파트너를 위해이 단계를 수행하고 있기 때문에 수동으로 수행해야 할 단계는 없습니다. – kemri

+0

실제로 메타 저장소를 새로 고침해야합니다. 테이블에 임 플라이 (impala) 명령을 추가하는 것이 tablename을 필요로합니다. 예를 들어, -hive-import – spijs

답변

0

. 명백한 이유 때문에 나는 당신의 특정 요구 사항을 테스트하지 않았기 때문에 이러한 sqoop 명령으로 자주 튜닝을해야 할 수도 있습니다. 마루로 가져 오는 내 경험으로 schema32 테이블을 테이블로 사용할 수 없기 때문에 --query 옵션을 사용해야합니다.

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-shell -q [query]을 사용하여 impala 명령을 실행할 수있는 CL 또는 단일 bash 스크립트에서 두 명령을 모두 _ 행할 수 있습니다.

+0

설명과 연습을 해주셔서 감사합니다! 나는 가능한 한 빨리 이것을 시험 할 것입니다.--hive-database 매개 변수에 대해 – kemri

+0

을 사용하고 있는데, "사용할 데이터베이스"라고 말하면, 우리가 구하려고하는 oracle db의 이름을 의미합니까? – kemri

+0

하이브 메타 스토어 데이터베이스의 이름입니다. 원본 데이터베이스가 아닌 – spijs