[HADOOP] 열쇠에 대한 최대 가치 발견
HADOOP열쇠에 대한 최대 가치 발견
나는 가장 큰 지역을 가진 가장 큰 나라를 찾고 싶다.
내 데이터 세트는 다음과 같습니다.
Afghanistan 648
Albania 29
Algeria 2388
Andorra 0
Austria 84
Bahrain 1
Bangladesh 143
Belgium 31
Benin 113
Bhutan 47
Brunei 6
Bulgaria 111
Burma 678
Cameroon 474
Central-African-Republic 623
Chad 1284
China 9561
Cyprus 9
Czechoslovakia 128
Denmark 43
Djibouti 22
Egypt 1001
Equatorial-Guinea 28
Ethiopia 1222
Finland 337
France 547
Germany-DDR 108
Germany-FRG 249
Greece 132
Guam 0
Hong-Kong 1
Hungary 93
India 3268
누구든지 mapreduce 프로그램을 쓸 수 있습니까?
내 매퍼 및 감속기 코드는 다음과 같습니다.
매퍼
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
String[] tokens = value.toString().split(",");
if(Integer.parseInt(tokens[2]) == 1){
context.write(new Text(tokens[0]), new IntWritable(Integer.parseInt(tokens[3])));
}
}
감속기
public void reduce(Text key,Iterable<IntWritable> values,Context context) throws IOException, InterruptedException{
int max = 0;
for(IntWritable x : values){
if(max < Integer.parseInt(String.valueOf(x))){
max = Integer.parseInt(String.valueOf(x));
}
}
context.write(key, new IntWritable(max));
}
해결법
-
==============================
1.알고리즘은 쉽습니다. 매퍼에서 최대를 수집하고 매퍼의 끝에 정리를 사용하여 디스크에 기록합니다.
알고리즘은 쉽습니다. 매퍼에서 최대를 수집하고 매퍼의 끝에 정리를 사용하여 디스크에 기록합니다.
int max = Integer.MIN_VALUE; String token; @Override public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] tokens = value.toString().split(","); if(Integer.parseInt(tokens[2]) == 1){ int val = Integer.parseInt(tokens[3]) if(Integer.parseInt(tokens[3]) > max){ max = val; token = tokens[0]; } } } @Override public void cleanup(Context context) throws IOException, InterruptedException { context.write(new LongWritable(max), new Text(token)); }
모든 물건은 이제 최대 값으로 줄어 듭니다. 즉, 내림차순으로 정렬하면 감속기의 첫 번째 레코드가 최대 값이됩니다. 그러므로 직장에서 이것을 설정해야합니다 :
job.setSortComparatorClass(LongWritable.DecreasingComparator.class);
감속기는 최대 값 (첫 번째 레코드)이있는 경우 모든 국가를 출력하는 단순히 발견되거나 발견되지 않는 스위치입니다.
boolean foundMax = false; @Override public void reduce(LongWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException{ if(!foundMax){ for(Text t : values){ context.write(t, key); } foundMax = true; } }
from https://stackoverflow.com/questions/31325846/finding-biggest-value-for-key by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] map-reduce를 사용하여 분산 된 KD 트리 만들기 (0) | 2019.06.21 |
---|---|
[HADOOP] hadoop-streaming 예제를 실행하지 못했습니다 - 맵에서 key에 유형 불일치 (0) | 2019.06.21 |
[HADOOP] 지도 축소의 보조 정렬 (0) | 2019.06.21 |
[HADOOP] webhdfs API를 사용하여 Azure datalake에 액세스하는 방법 (0) | 2019.06.21 |
[HADOOP] Flume - MySQL에서 Hadoop으로 데이터 마이그레이션 (0) | 2019.06.21 |