나는 최근에 Hadoop 관련 책을 읽고 있습니다. 나는 그런 느낌이 들기 때문에 WordCount 프로그램을 모방하여 통계적으로 관련된 제품을 작성했습니다.
요구 사항 설명 :
슈퍼마켓의 판매 목록에 따르면 상품 간의 상관 관계 정도를 계산하십시오 (즉, 상품 A와 상품 B를 동시에 구매 한 횟수를 계산하십시오).
데이터 형식 :
슈퍼마켓 판매 목록은 다음 형식으로 단순화됩니다. 줄은 목록을 나타내고 각 제품은 아래 그림과 같이 ","로 나뉩니다.
요구 사항 분석 :
Hadoop에서 MapReduce를 사용 하여이 요구 사항을 계산하십시오.
맵 함수는 주로 관련 제품을 나누고, 출력 결과는 키가 제품 A이고 값은 제품 B임을 알 수 있습니다. 첫 번째 및 세 가지 결과의 분할 결과는 다음과 같습니다.
두 상품 A 및 B와 관련이있는 제품을 계산하기 위해 상품 A와 B 간의 관계는 두 가지 결과, 즉 AB와 BA를 출력합니다.
제품 A와 관련된 제품을 그룹화하고 계산 한 결과, 즉 각 제품이 값에 나타나는 횟수를 계산하고 출력 결과는 키가 제품 A | 제품 B이며 값은이 조합이 발생하는 횟수입니다. 위에서 언급 한 5 개의 레코드의 경우 맵 출력에서 R의 키 값을 분석하십시오.
맵 함수의 처리를 통해 아래 그림에 표시된 레코드가 얻어집니다.
감소의 값 값 출력은 그룹화 및 계산되며 결과는 아래 그림에 나와 있습니다.
제품 AB를 키로 사용하고 제품 수를 출력 값으로 결합하면 출력 결과가 아래 그림에 나와 있습니다.
요구 사항의 구현 프로세스 분석은 지금까지 끝났습니다. 아래의 특정 코드 구현을 살펴 보겠습니다.
코드 구현 :
코드에 대한 자세한 소개를하지 않을 것입니다. 자세한 내용은 코드의 주석을 참조하십시오.
패키지 com; import java.io.ioexception; java.util.hashmap import; Java.util.map.entry 가져 오기; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.conf.configured; import org.apache.hadoop.fs.path; import org.apache.hadoop.io.intwritable; import org.apache.hadoop.io.longwritable; import org.apache.hadoop.io.text; import org.apache.hadoop.mapreduce.job; import org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.reducer; import org.apache.hadoop.mapreduce.lib.input.fileinputformat; import org.apache.hadoop.mapreduce.lib.output.fileoutputformat; import org.apache.hadoop.mapreduce.lib.output.textoutputformat; import org.apache.hadoop.util.tool; import org.apache.hadoop.util.toolrunner; 공개 클래스 테스트 확장 구성된 구현 도구 { / ** * 맵 클래스, 데이터 전처리 구현 * 출력 결과 키는 제품 A 값 A 및 관련 제품 B * @Author Lulei * / public static class mapt를 확장 <longwritable, text, text, text> {public void map (longwritable value, context context). value.tostring (); if (! vs.length; ".". 출력 결과 키는 제품 A | B 값이며, 이는 연관성입니다.* @author lulei*/public static class reding <텍스트, 텍스트, intwritable> {private int count;/public void 설정 (context 컨텍스트) {this.count = integer.parseint (countstr)} catch (예외 e) {this.count = 0; Hashmap <String, Integer> Hashmap = New Hashmap <String, integer> (); // 해시를 사용하여 (텍스트 값 : 값) {String valuest = value.toString (); if (hashmap.containskey (valuest)) {hashmap.put (valuest, hashmap.get (valuest) + 1); } else {hashmap.put (valuest, 1); }} // (Entry <string, integer> 항목 : hashmap.entryset ())) {if (enther.getValue ()> = this.count) {// output context.write (keystr + "|" + eTry.GetKey ()), new intwritable (entherwitable ()); }}}} @override public int run (string [] arg0)은 예외를 던집니다. conf.set ( "count", arg0 [2]); 직업 직업 = 새로운 직업 (conf); job.setJobName ( "JobTest"); job.setOutputFormatClass (TextOutputFormat.class); job.setOutputKeyClass (text.class); job.setOutputValueClass (text.class); job.setMapperClass (mapt.class); job.SetReducerClass (redet.class); fileInputFormat.AdDinputPath (job, new Path (Arg0 [0]); fileoutputformat.setoutputpath (job, new Path (arg0 [1]); job.waitforcompletion (true); job.issuccessful () 반환? 0 : 1; } / ** * @param args * / public static void main (string [] args) {// todo 자동 생성 메소드 스터브 if (args.length! = 3) {system.exit (-1); } try {int res = toolrunner.run (new configuration (), new test (), args); System.Exit (RES); } catch (예외 e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); }}} 업로드 및 실행 :
프로그램을 JAR 파일로 포장하고 기계 그룹에 업로드하십시오. 테스트 데이터를 HDFS 분산 파일 시스템에 업로드하십시오.
실행중인 명령의 스크린 샷은 다음 그림에 나와 있습니다.
실행이 완료되면 아래 그림과 같이 해당 HDFS 파일 시스템을 확인하십시오.
다음은 완전한 MapReduce 프로그램입니다. 나는 Hadoop에 대해 계속 배울 것입니다 ~ 읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!