【原創】MapReduce編程系列之表連接

  • 問題描述

? ? ? ? 需要連接的表如下:其中左邊是child,右邊是parent,我們要做的是找出grandchild和grandparent的對應關系,為此需要進行表的連接。


Tom Lucy
Tom Jim
Lucy David
Lucy Lili
Jim Lilei
Jim SuSan
Lily Green
Lily Bians
Green Well
Green MillShell
Havid James
James LiT
Richard Cheng
Cheng LiHua
  • 思路分析
誠然,在寫MR程序的時候要結合MR數據處理的一些特性。例如如果我們用默認的TextInputFormat來處理傳入的文件數據,傳入的格式是key為行號,value為這一行的值(如上例中的第一行,key為0,value為[Tom,Lucy]),在shuffle過程中,我們的值如果有相同的key,會merge到一起(這一點很重要!)。我們利用shuffle階段的特性,merge到一組的數據夠成一組關系,然后我們在這組關系中想辦法區分晚輩和長輩,最后對merge里的value一一作處理,分離出grandchild和grandparent的關系。
例如,Tom Lucy傳入處理后我們將其反轉,成為Lucy Tom輸出。當然,輸出的時候,為了達到join的效果,我們要輸出兩份,因為join要兩個表,一個表為L1:child parent,一個表為L2:child parent,為了達到關聯的目的和利用shuffle階段的特性,我們需要將L1反轉,把parent放在前面,這樣L1表中的parent和L2表中的child如果字段是相同的那么在shuffle階段就能merge到一起。還有,為了區分merge到一起后如何區分child和parent,我們把L1表中反轉后的child(未來的 grandchild)字段后面加一個1,L2表中parent(未來的grandparent)字段后加2。
 1 package com.test.join;
 2 
 3 import java.io.IOException;
 4 import java.util.ArrayList;
 5 import java.util.Iterator;
 6 
 7 import org.apache.hadoop.conf.Configuration;
 8 import org.apache.hadoop.fs.Path;
 9 import org.apache.hadoop.io.Text;
10 import org.apache.hadoop.mapreduce.Job;
11 import org.apache.hadoop.mapreduce.Mapper;
12 import org.apache.hadoop.mapreduce.Reducer;
13 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
14 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
15 
16 public class STJoin {
17 
18     public static class STJoinMapper extends Mapper<Object, Text, Text, Text>{
19 
20         @Override
21         protected void map(Object key, Text value, Context context)
22                 throws IOException, InterruptedException {
23             // TODO Auto-generated method stub
24             String[] rela = value.toString().trim().split(" ",2);
25             if(rela.length!=2)
26                 return;
27             String child = rela[0];
28             String parent = rela[1];
29             context.write(new Text(parent), new Text((child+"1")));
30             context.write(new Text(child), new Text((parent+"2")));
31             
32         }
33         
34     }
35     public static class STJoinReducer extends Reducer<Text, Text, Text, Text>{
36 
37         @Override
38         protected void reduce(Text arg0, Iterable<Text> arg1,Context context)
39                 throws IOException, InterruptedException {
40             // TODO Auto-generated method stub
41             ArrayList<String> grandParent = new ArrayList<>();
42             ArrayList<String> grandChild = new ArrayList<>();
43             Iterator<Text> iterator = arg1.iterator();
44             while(iterator.hasNext()){
45                 String text = iterator.next().toString();
46                 if(text.endsWith("1"))
47                     grandChild.add(text.substring(0, text.length()-1));
48                 if(text.endsWith("2"))
49                     grandParent.add(text.substring(0, text.length()-1));
50             }
51             
52             for(String grandparent:grandParent){
53                 for(String grandchild:grandChild){
54                     context.write(new Text(grandchild), new Text(grandparent));
55                 }
56             }
57         }
58     }
59     
60     
61     public static void main(String args[]) throws IOException, ClassNotFoundException, InterruptedException {
62         Configuration conf = new Configuration();
63         Job job = new Job(conf,"STJoin");
64         job.setMapperClass(STJoinMapper.class);
65         job.setReducerClass(STJoinReducer.class);
66         job.setOutputKeyClass(Text.class);
67         job.setOutputValueClass(Text.class);
68         FileInputFormat.addInputPath(job, new Path("hdfs://localhost:9000/user/hadoop/STJoin/joinFile"));
69         FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/user/hadoop/STJoin/joinResult"));
70         
71         System.exit(job.waitForCompletion(true)?0:1);
72     }
73 }
  • 結果顯示

?

Richard    LiHua
Lily    Well
Lily    MillShell
Havid    LiT
Tom    Lilei
Tom    SuSan
Tom    Lili
Tom    David

?以上代碼在hadoop1.0.3平臺實現

轉載于:https://www.cnblogs.com/gslyyq/p/mapreduce.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376755.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376755.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376755.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python logging模塊簡單使用

logging 是線程安全的&#xff0c;也就是說&#xff0c;在一個進程內的多個線程同時往同一個文件寫日志是安全的。 但是多個進程往同一個文件寫日志不是安全的。 import loggingLOG_FORMAT "%(asctime)s - %(levelname)s - %(message)s" DATE_FORMAT "%m/%d/…

OpenACC 中parallel 和kernels的區別

Kernels構件 Kernels構件源于PGI Accelerator模型的region構件。嵌套kernels構件里的循環可能會被編譯器轉換成能在GPU上高效并行的部分。在這個過程中有三步。 1&#xff1a;判斷并行中遇到的循環。 2&#xff1a;把抽象的并行轉換成硬件上的并行。對于NVIDIA CUDA GPU&#…

ORACLE基本SQL語句-查詢篇

一、普通查詢 /*查詢表數據*/select * from STU /*取出前3行數據*/select * from stu where ROWNUM<3 /*模糊查詢*/select * from stu where stu_id like stu001% 說明&#xff1a;通配符“%”代表一個或者多個字符&#xff0c;通配符“_”代表一個字符。 /*別名*/select S…

三次握手建立失敗的幾種情況以及三次握手的理解

上面的圖是阻塞式socket進行通信的過程&#xff0c;阻塞的時候是操作系統內核網絡協議棧在工作 調用 connect 函數將激發 TCP 的三次握手過程&#xff0c;而且僅在連接建立成功或出錯時才返回。其中出錯返回可能有以下幾種情況&#xff1a; 1、三次握手無法建立&#xff0c;客…

db_name,instance_name,service_names,db_domain,dbid,oracle_sid等區別與聯系

最近整理了一篇文章&#xff1a;oracle listener 有網友對數據庫是否顯式設置了instance_name和service_names提出疑問。 由此引發出db_name,instance_name,oracle_sid等等這些常見的參數都代表什么意思&#xff0c;怎么取值的&#xff0c;有什么區別&#xff1f; SQL> sele…

檢測版本更新

如果我們要檢測app版本的更新&#xff0c;那么我們必須獲取當前運行app版本的版本信息和appstore 上發布的最新版本的信息。 當前運行版本信息可以通過info.plist文件中的bundle version中獲取&#xff1a; [cpp] view plaincopy NSDictionary *infoDic [[NSBundle mainBundle…

linux 啟動/關閉多個py腳本

后臺運行腳本 需求&#xff1a;很多時候我們會在 linux 服務器上執行 python 腳本&#xff0c;然而腳本程序執行的時間可能比較長&#xff0c;當耗時過長的情況下&#xff0c;我們使用 ssh 遠程登錄到 linux 服務器上容易造成超時自動斷開連接&#xff0c;當用戶注銷時&#x…

在熟練使用2B鉛筆前,請不要打開Axure

在互聯網產品領域&#xff0c;Axure已成為產品經理、產品設計師以及交互設計師的必備工具&#xff0c;從某種程度講&#xff0c;Axure幫助我們建立低保真模型&#xff0c;便于與用戶的需求驗證&#xff0c;也幫助我們構思交互細節&#xff0c;使前端和開發人員更容易理解我們的…

啟用isqlplus

iSQL*Plus是sqlplus基于web方式發布的&#xff0c;要使用它只要在服務器上開啟即可&#xff1a; [oraclelocalhost ~]$ isqlplusctl start perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE (unset), LC_ALL (unset)…

YUI 的模塊信息配置優先級關系梳理

背景 YUI的配置參數較多&#xff0c; 可以在好幾個地方配置一個module的相關信息&#xff0c; 如&#xff1a; //在全局配置&#xff0c; 所以YUI實例共享 YUI_config {modules: {w-autcomplete: {requires: [module1],path: test1.js,}},groups: {modules: {w-autocomplete: …

echarts 怎么知道鼠標點擊的哪根柱子

有個需求&#xff0c;點擊柱子&#xff0c;然后得到該柱子的信息&#xff0c;然后展示這個機房的時序圖。 第一步卡住了&#xff0c;就是不知道如何獲取柱子的序號。后參考&#xff1a;https://blog.csdn.net/zt_fucker/article/details/72461572?utm_sourceblogxgwz1 得到思路…

Oracle經典sql語句總結@sql-plus重點函數串講與sql語句案例@中文排序詳講).doc

1.經典的select sql語句 //注意&#xff1a;包含空值的數學表達式求出的結果為空值 SQL> select salcomm from emp; //連接員工編號與員工姓名這兩個字段 SQL> select empno||ename as "員工編號和員工姓名" from emp; //查詢去掉重復行的員工部門編號 SQL>…

C++模板簡單分析與舉例

C模板簡單分析與舉例 #pragma once #include <iostream> /*/ C 模板 /*/ /* --- 函數模板 --- */ /// 聲明 template <typename T1, typename T2> void TFunc(T1, T2); /// 一般定義 template <typename T1, typename T2> void TFunc(T1, T2) { std::cout &l…

flash builder4.7 for Mac升級AIRSDK詳解

使用flash builder 打包ANE時或者打包ipa時候常常會遇到AIRSDK版本低的問題&#xff0c;然而flash builder4.7默認使用的AIRSDK是3.4而flash builder4.7 中 Flex SDK中默認的AIRSDK是3.1,大家可能有疑問怎么有二個AIRSDK。我的理解是Flex SDK中的AIRSDK是低版本&#xff0c;低版…

echarts formatter鼠標懸停顯示信息

由于echarts中柱狀圖&#xff0c;鼠標放上去默認顯示的是x軸名稱以及y軸值。 而我現在需要再添加一些顯示信息。 下面是操作&#xff1a; 在tooltip對象中補充trigger: “axis”,屬性&#xff0c;然后再設置formatter。 tooltip : {formatter: function (params) {// do some …

codeforces 261 D

題目鏈接&#xff1a; 解題報告&#xff1a;給出一個序列a1,a2,a3.........an&#xff0c;f(i , j ,x) ak 等于x的個數(i < k < j)&#xff0c;令i < j&#xff0c;求有多少對 i 和 j 使得 f(1,i,ai) > f(j,n,aj)。 從左往右掃一遍這個序列&#xff0c;num1[i] 等于…

javascript下漢字和Unicode編碼互轉代碼

近日在為網站做一資料功能&#xff0c;這些顯示在頁面上面的文字數據都是存放在js文件裏面的&#xff0c;由於這些js文件裏面的中文都是經過unicode編碼的&#xff0c;頁面上顯示是沒有問題的&#xff0c;問題是我做的網站是繁體中文&#xff0c;而js文件裏面的中文數據是簡體中…

python 線程異步執行踩坑

有個需求&#xff0c;一個線程在得到n個數據之后&#xff0c;異步地執行一個子線程函數&#xff0c;在子線程函數中完成數據庫的打開、寫入數據、關閉操作。在子線程函數返回前父線程先返回結果。 在此之前&#xff0c;先導入我們需要的模塊&#xff1a; from concurrent.futu…

關于window.history.back()后退問題

Windows下的window.history.back()后退后返回的不僅僅是前一個頁而是前一個頁的狀態。假設一個頁我改動了3次那必須后退3次才干回到前一個頁。并且數據庫中刪除的數據依舊顯示在上面感覺很的不有用。 解決的方法&#xff1a;history.back()后再加一個reload()這樣就能夠回到刷新…

每日英語:Smog Levels in Hong Kong Hit Highs

Hong Kong’s pollution levels hit nearly decade-level highs this week, sending locals scurrying inside and obscuring the city’s skyline behind a blanket of white. scurry&#xff1a;急跑&#xff0c;急趕    In the city’s central business district, road…