2016-10-14 8 views
0

작동하도록 hive-hadoop-mongo 설치를 시도하고 있습니다.하이브 충돌 where 절

CREATE EXTERNAL TABLE reviews(
    user_id STRING, 
    review_id STRING, 
    stars INT, 
    date1 STRING, 
    text STRING, 
    type STRING, 
    business_id STRING 
    ) 
    STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler' 
    WITH SERDEPROPERTIES('mongo.columns.mapping'='{"date1":"date"}') 
    TBLPROPERTIES('mongo.uri'='mongodb://localhost:27017/test.reviews'); 

이 부분은 잘 작동 A 모두 선택 쿼리 (select * from reviews)이 그것 같이 모든 출력하기 때문에 : 나는 JSON 파일에서 MongoDB를로 데이터를 가져온 후, 나는 몽고에 연결 하이브에서 내부 및 외부 테이블을 생성 할까요. 하지만 where 절 (예 : select * from reviews where stars=4)을 사용하여 하이브가 충돌하면 충돌이 발생합니다.

은 내가 하이브 시작할 때 다음과 같은 항아리가 추가되고 있습니다

add jar mongo-hadoop.jar; 
add jar mongo-java-driver-3.3.0.jar; 
add jar mongo-hadoop-hive-2.0.1.jar; 

을 그리고 그것은 어떤 의미에서 관련있는 경우, 나는이 아마존의 EMR 클러스터를 사용하고, 나는 ssh를 통해 연결하고있다. 모든 도움 여기

에 대한

덕분에 오류 하이브 밖으로 던져입니다 :

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.exec.Utilities.deserializeExpression(Ljava/lang/String;)Lorg/apache/hadoop/hive/ql/plan/ExprNodeGenericFuncDesc; 
    at com.mongodb.hadoop.hive.input.HiveMongoInputFormat.getFilter(HiveMongoInputFormat.java:134) 
    at com.mongodb.hadoop.hive.input.HiveMongoInputFormat.getRecordReader(HiveMongoInputFormat.java:103) 
    at org.apache.hadoop.hive.ql.exec.FetchOperator$FetchInputFormatSplit.getRecordReader(FetchOperator.java:691) 
    at org.apache.hadoop.hive.ql.exec.FetchOperator.getRecordReader(FetchOperator.java:329) 
    at org.apache.hadoop.hive.ql.exec.FetchOperator.getNextRow(FetchOperator.java:455) 
    at org.apache.hadoop.hive.ql.exec.FetchOperator.pushRow(FetchOperator.java:424) 
    at org.apache.hadoop.hive.ql.exec.FetchTask.fetch(FetchTask.java:144) 
    at org.apache.hadoop.hive.ql.Driver.getResults(Driver.java:1885) 
    at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:252) 
    at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:183) 
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:399) 
    at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:776) 
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:714) 
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:641) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 

답변

0

크레타 테이블 아래 체크처럼. 오브젝트 BSON하는 하이브 개체로부터

CREATE [EXTERNAL] TABLE <tablename> 
(<schema>) 
ROW FORMAT SERDE 'com.mongodb.hadoop.hive.BSONSerDe' 
[WITH SERDEPROPERTIES('mongo.columns.mapping'='<JSON mapping>')] 
STORED AS INPUTFORMAT 'com.mongodb.hadoop.mapred.BSONFileInputFormat' 
OUTPUTFORMAT 'com.mongodb.hadoop.hive.output.HiveBSONFileOutputFormat' 
[LOCATION '<path to existing directory>']; 
대신 직렬화를 판독 직렬화하는 StorageHandler를 사용

, 출력 데이터는, 각각의 성분은 개별적으로 열거된다. 네이티브 HDFS 파일 시스템

+0

이제 오류가 발생합니다 :'FAILED : 실행 오류, org.apache.hadoop.hive.ql.exec.DDLTask에서 코드 1을 반환하십시오. MetaException (메시지 : 예외 : java.io.IOException 없음 FileSystem for scheme : mongodb)' – Jonathan

+0

관련 메모에서 하이브가 mongo를 직접 쿼리하는 대신 mongodb 덤프 파일을 읽는다는 의미입니까? – Jonathan

0

을 처리 할 때 StorageHandler를 사용하여 너무 많은 부정적인 영향을 가지고 있기 때문에 이것은 내가

WITH SERDEPROPERTIES('mongo.columns.mapping'='{"date1":"date"}') 

를 참조하고 매핑되지 않은 열 별을 쿼리하는 것입니다.

+0

설명서에는 매핑이 선택 사항이지만 모든 항목을 매핑했음을 알리는 내용이 나와 있습니다. 나는 여전히 같은 오류가 발생합니다. – Jonathan

0

이 프로브를 우리 클러스터에서 만났습니다.

클러스터 하이브 버전의 버전보다 높은 몽고 - 하이브

구 클래스 org.apache.hadoop.hive.ql.exec.Utilities.deserializeExpression는 조직 이름이 변경되었습니다 (1.2.1이다) .apache.hadoop.hive.ql.exec.SerializationUtilities.deserializeExpression

직접 병을 재구성해야합니다.