[HADOOP] 날짜 별 Java MapReduce 계산
HADOOP날짜 별 Java MapReduce 계산
저는 Hadoop을 처음 사용하고 있습니다. 그리고 MapReduce 프로그램을 수행하려고합니다. 날짜별로 처음 두 개의 출현자를 계산합니다 (월별로 그룹화). 그래서 제 입력은 다음과 같습니다.
2017-06-01 , A, B, A, C, B, E, F
2017-06-02 , Q, B, Q, F, K, E, F
2017-06-03 , A, B, A, R, T, E, E
2017-07-01 , A, B, A, C, B, E, F
2017-07-05 , A, B, A, G, B, G, G
그래서,이 MapReduce 프로그램의 결과로 기대하고 있습니다.
2017-06, A:4, E:4
2017-07, A:4, B:4
공용 클래스 ArrayGiulioTest {
공공 정적 로거 로거 = Logger.getLogger (ArrayGiulioTest.class);
public static class CustomMap는 Mapper를 확장합니다.
해결법
-
==============================
1.나는 당신이 매퍼에서 너무 많은 일을하려한다고 생각합니다. 날짜를 그룹화하기 만하면됩니다 (예상 출력에 따라 서식을 제대로 지정하지 않은 것 같습니다).
나는 당신이 매퍼에서 너무 많은 일을하려한다고 생각합니다. 날짜를 그룹화하기 만하면됩니다 (예상 출력에 따라 서식을 제대로 지정하지 않은 것 같습니다).
다음과 같은 접근 방식은이 선을 돌릴 것입니다. 예를 들어
2017-07-01 , A, B, A, C, B, E, F 2017-07-05 , A, B, A, G, B, G, G
이 감속기 쌍으로
2017-07 , ("A,B,A,C,B,E,F", "A,B,A,G,B,G,G")
즉, ArrayWritable을 사용하여 텍스트로 유지하면 실제 이익을 얻을 수 없습니다.
그래서 매퍼는 다음과 같이 보일 것입니다.
class CustomMap extends Mapper<LongWritable, Text, Text, Text> { private final Text key = new Text(); private final Text output = new Text(); @Override protected void map(LongWritable offset, Text value, Context context) throws IOException, InterruptedException { int separatorIndex = value.find(","); final String valueStr = value.toString(); if (separatorIndex < 0) { System.err.printf("mapper: not enough records for %s", valueStr); return; } String dateKey = valueStr.substring(0, separatorIndex).trim(); String tokens = valueStr.substring(1 + separatorIndex).trim().replaceAll("\\p{Space}", ""); SimpleDateFormat fmtFrom = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat fmtTo = new SimpleDateFormat("yyyy-MM"); try { dateKey = fmtTo.format(fmtFrom.parse(dateKey)); key.set(dateKey); } catch (ParseException ex) { System.err.printf("mapper: invalid key format %s", dateKey); return; } output.set(tokens); context.write(key, output); } }
감속기는 값 문자열에서 값을 수집하고 계산하는 Map을 작성할 수 있습니다. 다시 말하지만, 텍스트 만 쓰십시오.
class CustomReduce extends Reducer<Text, Text, Text, Text> { private final Text output = new Text(); @Override protected void reduce(Text date, Iterable<Text> values, Context context) throws IOException, InterruptedException { Map<String, Integer> keyMap = new TreeMap<>(); for (Text v : values) { String[] keys = v.toString().trim().split(","); for (String key : keys) { if (!keyMap.containsKey(key)) { keyMap.put(key, 0); } keyMap.put(key, 1 + keyMap.get(key)); } } output.set(mapToString(keyMap)); context.write(date, output); } private String mapToString(Map<String, Integer> map) { StringBuilder sb = new StringBuilder(); String delimiter = ", "; for (Map.Entry<String, Integer> entry : map.entrySet()) { sb.append( String.format("%s:%d", entry.getKey(), entry.getValue()) ).append(delimiter); } sb.setLength(sb.length()-delimiter.length()); return sb.toString(); } }
당신의 의견을 감안할 때, 저는 이것을 얻었습니다.
2017-06 A:4, B:4, C:1, E:4, F:3, K:1, Q:2, R:1, T:1 2017-07 A:4, B:4, C:1, E:1, F:1, G:3
-
==============================
2.주된 문제는 reduce 메소드의 부호에 관한 것입니다.
주된 문제는 reduce 메소드의 부호에 관한 것입니다.
나는 쓰고 있었다 : public void reduce (텍스트 키, Iterator
값, 컨텍스트 컨텍스트) 대신에
public void reduce(Text key, Iterable<ArrayTextWritable> values,
이것이 Reduce 출력 대신 Map 출력을 얻는 이유입니다
from https://stackoverflow.com/questions/44399163/java-mapreduce-counting-by-date by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 분산 캐시 (0) | 2019.07.02 |
---|---|
[HADOOP] HBase에서 Hive로 테이블을 옮기는 방법은 무엇입니까? (0) | 2019.07.02 |
[HADOOP] spark - java 힙 공간 문제 - ExecutorLostFailure - 상태 143으로 종료 된 컨테이너 (0) | 2019.07.02 |
[HADOOP] 하이브 "ANALYZE TABLE"자바에서 실행하는 방법 (0) | 2019.07.02 |
[HADOOP] Map 이클립스 2.4.1에 대한 클라이언트 jar 줄이기 (0) | 2019.07.02 |