2013-11-04 4 views
0

MR 작업의 결과를 여러 CQL3 열 패밀리에 출력해야합니다.Hadoop CQL3을 사용한 다중 출력

내 감속기에서는 Multiple Outputs를 사용하여 CF를 지정하지만 모든 결과는 작업의 OutputCQL 문에 정의 된 하나의 CF에 기록됩니다.

작업 definiton :

... 
job.setOutputFormatClass(CqlOutputFormat.class); 
ConfigHelper.setOutputKeyspace(job.getConfiguration(), "keyspace1"); 
MultipleOutputs.addNamedOutput(job, "CF1", CqlOutputFormat.class, Map.class, List.class); 
MultipleOutputs.addNamedOutput(job, "CF2", CqlOutputFormat.class, Map.class, List.class); 
CqlConfigHelper.setOutputCql(job.getConfiguration(), "UPDATE keyspace1.CF1 SET value = ? "); 
... 

감속기 클래스 설정 :

mos = new MultipleOutputs(context); 

방법 (psudo 코드) 감소 : 내 감속기는 CF 내가 지정 무시

keys = new LinkedHashMap<>(); 
keys.put("key", ByteBufferUtil.bytes("rowKey")); 
keys.put("name", ByteBufferUtil.bytes("columnName")); 

List<ByteBuffer> variables = new ArrayList<>(); 
variables.add(ByteBufferUtil.bytes("columnValue")); 

mos.write("CF2", keys, variables); 

문제가된다 mos.write()에서 대신 outputCQL 만 실행해야합니다. 위의 예에서 모든 것은 CF1에 기록됩니다.

Ive는 "UPDATE keyspace1? SET value =?"의 줄을 따라 CF를 outputCQL에 삽입하기 위해 준비된 명령문을 사용해 보았습니다.하지만 이처럼 CF에 대해 자리 표시자를 사용할 수 있다고는 생각하지 않습니다.

감속기 클래스 내에서 outputCQL을 덮어 쓸 수있는 방법이 있습니까?

답변

0

그래서 간단한 대답은 mr 작업의 결과를 여러 CF로 출력 할 수 없다는 것입니다. 그러나이를 수행해야하는 필요성이 실제로 Hadoop의 누락 ​​된 기능보다는 접근법의 결함을 강조합니다.

레코드 묶음을 한 번에 처리하고 2 개의 다른 결과 세트를 한 번에 생성하려고 시도하는 대신 더 나은 방법은 원하는 결과 세트를 반복적으로 얻는 것입니다. 기본적으로 이는 원하는 결과가 달성 될 때까지 여러 작업이 이전 작업의 결과를 반복하는 것을 의미합니다.