1. 程式人生 > >MapReduce程式設計-自連線

MapReduce程式設計-自連線

SQL自連線

SQL自身連線,可以解決很多問題。下面舉的一個例子,就是使用了SQL自身連線,它解決了列與列之間的邏輯關係問題,準確的講是列與列之間的層次關係。

對於下面的表cp(儲存的孩子和父母的關係),用一個SQL,找出所有的 grandchild 和 grandparent,就是找出所有的 孫子 -> 祖父母

+-------+--------+
| child | parent |
+-------+--------+
| tom   | jack   |
| hello | jack   |
| tom   | tong   |
| jack  | gao    |
| tom   | jack   |
| hello | jack   |
| tong  | haha   |
+-------+--------+

可用如下SQL

select t1.child,t2.parent from cp t1,cp t2 where t1.parent = t2.child;

結果如下:

+-------+--------+
| child | parent |
+-------+--------+
| tom   | gao    |
| hello | gao    |
| tom   | haha   |
+-------+--------+

MapReduce程式設計實現

上面的SQL其實是做了一個笛卡爾積,怎麼用MR演算法來實現呢?

使用連線列作為key來實現相等匹配。需要讓map的輸出能包含左右兩張表(t1,t2)的資訊。


對於如下的輸入檔案:

Tom Lucy
Tom Jack
Jone Lucy
Jone Jack
Lucy Mary
Lucy Ben
Jack Alice
Jack Jesse
Terry Tom

map的輸出是:
Tom parent_Lucy
Lucy child_Tom
Tom parent_Jack
Jack child_Tom
.....

其實就是每條記錄都重複兩次,來表示兩張表。

map函式如下:

		public void map(Object key, Text value, Context context)
				throws IOException, InterruptedException {
			String strs[] = value.toString().split(" ");
			if (strs.length == 2) {
				context.write(new Text(strs[0]), new Text("parent_" + strs[1]));
				context.write(new Text(strs[1]), new Text("child_" + strs[0]));
			}
		}


reduce函式:

		public void reduce(Text text, Iterable<Text> values, Context context)
				throws IOException, InterruptedException {
			List<Text> grandchilds = new ArrayList<Text>();
			List<Text> grandparents = new ArrayList<Text>();
			for (Text name : values) {
				if (name.toString().trim().startsWith("child_")) {
					grandchilds.add(new Text(name.toString().substring(6)));
				} else if (name.toString().trim().startsWith("parent_")) {
					grandparents.add(new Text(name.toString().substring(7)));
				}
			}
			for (Text gchild : grandchilds) {
				for (Text gparent : grandparents) {
					context.write(gchild, gparent);
				}
			}
		}
	}

輸出結果為:

JoneJesse
JoneAlice
TomJesse
TomAlice
TomBen
TomMary
JoneBen
JoneMary
TerryJack
TerryLucy

相關推薦

MapReduce程式設計-連線

SQL自連線 SQL自身連線,可以解決很多問題。下面舉的一個例子,就是使用了SQL自身連線,它解決了列與列之間的邏輯關係問題,準確的講是列與列之間的層次關係。 對於下面的表cp(儲存的孩子和父母的關係),用一個SQL,找出所有的 grandchild 和 grandpare

Hadoop鏈式MapReduce、多維排序、倒排索引、連線演算法、二次排序、Join效能優化、處理員工資訊Join實戰、URL流量分析、TopN及其排序、求平均值和最大最小值、資料清洗ETL、分析氣

Hadoop Mapreduce 演算法彙總  第52課:Hadoop鏈式MapReduce程式設計實戰...1 第51課:Hadoop MapReduce多維排序解析與實戰...2 第50課:HadoopMapReduce倒排索引解析與實戰...3 第49課:Hado

讀Muduo原始碼筆記---4(TCP連線

1、問題原因   svr掛掉了,埠釋放了,cli去connect這個目的埠的時候正好選擇了這個埠作為源埠,此時埠沒人用,使用是合法的。於是自連線形成了。 就是出現源ip和源埠通目的ip和目的埠完全相同的情況,也就是在服務端沒有啟動,客戶端也可以連線成功,但會造成服務端無法啟動

Hadoop完全分散式用MapReduce實現定義排序、分割槽和分組

    經過前面一段時間的學習,簡單的單詞統計已經不能實現更多的需求,就連自帶的一些函式方法等也是跟不上節奏了;加上前面一篇MapReduce的底層執行步驟的瞭解,今天學習自定義的排序、分組、分割槽相對也特別容易。 認為不好理解,先參考一下前面的一篇:https://bl

連線

到目前為止,我們講解的連線都是在不同的資料表之間進行的,其實參與連線的表完全可以是同一樣表,也就是表與其自身相連線,這樣連線就被稱為自連線。自連線並不是獨立於交叉連線、內連線、外連線等這些連線方式之外的另外一種連線方式,而只是這些連線方式的一種特例,也就是交叉連線、內連線、外連線等連線方式中只要參與連線的表是

MapReduce程式設計

MapReduce Coding Criteria 單個MapReduce 單元運算 以WordCount為例 分別編寫Map和Reduce函式 編寫main方法,設定環境變數,進行註冊:

MapReduce定義分割槽

package tq; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.mapreduce.Partitioner; public class MyPartition extends Partitioner<

MapReduce定義比較

package tq; import org.apache.hadoop.io.WritableComparable; import org.apache.hadoop.io.WritableComparator; public class MySortComparator extends W

sql語句_連線_外連線_左連線_子查詢_排序_分組

資料庫 sql語句 分為DDL,DCL,DLL 1),DDL,data define language: 新建一個數據庫 ceate建立 alter修改 drop刪 這三條語句,在下面幾個元件中,都可以用得到 資料庫分為下面幾個元件 a,資料庫,database #如果之前已

大資料技術學習筆記之Hadoop框架基礎2-MapReduce程式設計及執行流程

一、回顧     -》hadoop的功能?         -》海量資料儲存和海量計算問題         -》分散式檔案儲存框架hdfs和

簡單的單表連線查詢

insert into SayReply values ('其實我也不知道為啥不好','2017-04-21 11:34:43','曹操',3)insert into SayReply values ('我知道心情為啥不好','2017-04-21 11:35:36','諸葛亮',1)insert into

編寫簡單的Hadoop程式(連線)

準備工作: 如一個列為child,一個列為parent,需要找出grandchile, grandParent 如資料 Lucy Tom Lucy Jone Tom Heimi Tom QiQi Jone Candy Jone God Lucy有四個grandParent:Heimi

大資料之Hadoop學習——動手實戰學習MapReduce程式設計例項

文章目錄 一、MapReduce程式設計例項 1.自定義物件序列化 需求分析 報錯:Exception in thread "main" java.lang.IllegalArgumentExcept

MapReduce程式設計之Combiner

Combiner 可以理解為本地的reducer,減少了Map Tasks輸出的資料量以及資料網路傳輸量 編譯執行: hadoop jar /home/zq/lib/HDFS_Test-1.0-SNAPSHOT.jar MapReduce.CombinerAp

Python實現一個最簡單的MapReduce程式設計模型WordCount

MapReduce程式設計模型: Map:對映過程 Reduce:合併過程 import operator from functools import reduce # 需要處理的資料 lst = [ "Tom", "Jack",

mysql 外連結 連線

假設有兩張表,分別為表a和表b, a: id    name  nick_name 1     張三      張三 2     李四       李 3      王五      王五 b: id   age   a_id 1     23     1

MapReduce定義WordCount案例

在一堆給定的文字檔案中統計輸出每一個單詞出現的總次數。 1.分析 mapper階段: 將mapstack 傳給我們的文字資訊內容先轉換成string。 根據空格將一行切分成單詞。 將單詞輸出為<單詞,1>的格式。 reducer階段

讀Muduo原始碼筆記(TCP連線)---4

1、問題原因   svr掛掉了,埠釋放了,cli去connect這個目的埠的時候正好選擇了這個埠作為源埠,此時埠沒人用,使用是合法的。於是自連線形成了。 就是出現源ip和源埠通目的ip和目的埠完全相同的情況,也就是在服務端沒有啟動,客戶端也可以連線成功,但會造成服務端無法啟

MapReduce定義檔案輸出名

MR的輸出結果預設為part-r-00000,我們可自定義易識別的名字替代part,如score-r-00000/ job.setOutputFormatClass(MyOut.class); MyOut.setOutputN

SQL Server中的連線

不要配不上自己的野心,辜負了曾經歷的苦難 一、建庫和建表 create database scort use scort create table emp ( empno int primary key, ename nvarchar(10), sal int,