hadoop实例---多表关联
多表关联和单表关联类似,它也是通过对原始数据进行一定的处理,从其中挖掘出关心的信息。如下 输入的是两个文件,一个代表工厂表,包含工厂名列和地址编号列;另一个代表地址表,包含地址名列和地址编号列。要求从输入数据中找出工厂名和地址名的对应关系,
多表关联和单表关联类似,它也是通过对原始数据进行一定的处理,从其中挖掘出关心的信息。如下
输入的是两个文件,一个代表工厂表,包含工厂名列和地址编号列;另一个代表地址表,包含地址名列和地址编号列。要求从输入数据中找出工厂名和地址名的对应关系,输出工厂名-地址名表
样本如下:
factory:
factoryname addressed Beijing Red Star 1 Shenzhen Thunder 3 Guangzhou Honda 2 Beijing Rising 1 Guangzhou Development Bank 2 Tencent 3 Back of Beijing 1
address:
addressID addressname 1 Beijing 2 Guangzhou 3 Shenzhen 4 Xian
结果:
factoryname addressname Beijing Red Star Beijing Beijing Rising Beijing Bank of Beijing Beijing Guangzhou Honda Guangzhou Guangzhou Development Bank Guangzhou Shenzhen Thunder Shenzhen Tencent Shenzhen
代码如下:
import java.io.IOException; import java.util.*; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; 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.util.GenericOptionsParser; public class MTjoin { public static int time = 0; /* * 在map中先区分输入行属于左表还是右表,然后对两列值进行分割, * 保存连接列在key值,剩余列和左右表标志在value中,最后输出 */ public static class Map extends Mapper { // 实现map函数 public void map(Object key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString();// 每行文件 String relationtype = new String();// 左右表标识 // 输入文件首行,不处理 if (line.contains("factoryname") == true || line.contains("addressed") == true) { return; } // 输入的一行预处理文本 StringTokenizer itr = new StringTokenizer(line); String mapkey = new String(); String mapvalue = new String(); int i = 0; while (itr.hasMoreTokens()) { // 先读取一个单词 String token = itr.nextToken(); // 判断该地址ID就把存到"values[0]" if (token.charAt(0) >= '0' && token.charAt(0) 0) { relationtype = "1"; } else { relationtype = "2"; } continue; } // 存工厂名 mapvalue += token + " "; i++; } // 输出左右表 context.write(new Text(mapkey), new Text(relationtype + "+"+ mapvalue)); } } /* * reduce解析map输出,将value中数据按照左右表分别保存, * 然后求出笛卡尔积,并输出。 */ public static class Reduce extends Reducer { // 实现reduce函数 public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { // 输出表头 if (0 == time) { context.write(new Text("factoryname"), new Text("addressname")); time++; } int factorynum = 0; String[] factory = new String[10]; int addressnum = 0; String[] address = new String[10]; Iterator ite = values.iterator(); while (ite.hasNext()) { String record = ite.next().toString(); int len = record.length(); int i = 2; if (0 == len) { continue; } // 取得左右表标识 char relationtype = record.charAt(0); // 左表 if ('1' == relationtype) { factory[factorynum] = record.substring(i); factorynum++; } // 右表 if ('2' == relationtype) { address[addressnum] = record.substring(i); addressnum++; } } // 求笛卡尔积 if (0 != factorynum && 0 != addressnum) { for (int m = 0; m <pre class="brush:php;toolbar:false"> javac -classpath hadoop-core-1.1.2.jar:/opt/hadoop-1.1.2/lib/commons-cli-1.2.jar -d firstProject firstProject/MTJoin.java
jar -cvf MTJoin.jar -C firstProject/ .
删除已经存在的output
hadoop fs -rmr output
hadoop fs -mkdir input
hadoop fs -put factory input
hadoop fs -put address input
运行
hadoop jar MTJoin.jar MTJoin input output
查看结果
hadoop fs -cat output/part-r-00000
?
作者:a331251021 发表于2013-8-4 16:20:52 原文链接
阅读:72 评论:0 查看评论
原文地址:hadoop实例---多表关联, 感谢原作者分享。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java錯誤:Hadoop錯誤,如何處理和避免使用Hadoop處理大數據時,常常會遇到一些Java異常錯誤,這些錯誤可能會影響任務的執行,導致資料處理失敗。本文將介紹一些常見的Hadoop錯誤,並提供處理和避免這些錯誤的方法。 Java.lang.OutOfMemoryErrorOutOfMemoryError是Java虛擬機器記憶體不足的錯誤。當Hadoop任

PHP報錯:無法重複聲明類,解決方法!對開發者而言,遇到問題是常有的事情。而在PHP開發中,常會遇到一個常見的錯誤:無法重複聲明類別。這個問題看似簡單,但如果不及時解決,會導致程式碼無法正確執行。本文將介紹這個問題的原因,並提供解決方法,以供參考。當我們在PHP程式碼中定義一個類別時,如果在同一個檔案或多個檔案中多次定義同一個類,就會出現無法重複聲明類別的錯誤。這是

PHP中的命名規範:如何使用駝峰命名法命名類別、方法和變數在PHP程式設計中,良好的命名規範是一種重要的編碼實踐。它可以提高程式碼的可讀性和可維護性,並且使團隊合作更加順暢。在本文中,我們將探討一個常見的命名規格:駝峰命名法,並提供一些範例來說明如何在PHP中使用它來命名類別、方法和變數。一、什麼是駝峰命名法?駝峰命名法是一種常用的命名約定,其中每個單字的首字母大寫,

Golang是一門功能強大且高效的程式語言,可用於開發各種應用程式和服務。在Golang中,指標是一種非常重要的概念,它可以幫助我們更靈活和有效率地操作資料。指標轉換是指在不同類型之間進行指標操作的過程,本文將透過具體的實例來學習Golang中指標轉換的最佳實踐。 1.基本概念在Golang中,每個變數都有一個位址,位址就是變數在記憶體中的位置。

隨著大數據時代的到來,資料處理和儲存變得越來越重要,如何有效率地管理和分析大量的資料也成為企業面臨的挑戰。 Hadoop和HBase作為Apache基金會的兩個項目,為大數據儲存和分析提供了一個解決方案。本文將介紹如何在Beego中使用Hadoop和HBase進行大數據儲存和查詢。一、Hadoop和HBase簡介Hadoop是一個開源的分散式儲存和運算系統,它可

PHP中的封裝技術及應用封裝是物件導向程式設計中的重要概念,它指的是將資料和資料的操作封裝在一起,以便提供對外部程式的統一存取介面。在PHP中,封裝可以透過存取控制修飾符和類別的定義來實現。本文將介紹PHP中的封裝技術及其應用場景,並提供一些具體的程式碼範例。一、封裝的存取控制修飾符在PHP中,封裝主要透過存取控制修飾符來實現。 PHP提供了三個存取控制修飾符,

什麼是物件導向程式設計?物件導向程式設計(OOP)是一種程式設計範式,它將現實世界中的實體抽象化為類,並使用物件來表示這些實體。類別定義了物件的屬性和行為,而物件則實例化了類別。 OOP的主要優點在於它可以使程式碼更易於理解、維護和重複使用。 OOP的基本概念OOP的主要概念包括類別、物件、屬性和方法。類別是物件的藍圖,它定義了物件的屬性和行為。物件是類別的實例,它具有類別的所有屬性和行為。屬性是物件的特徵,它可以儲存資料。方法是物件的函數,它可以對物件的資料進行操作。 OOP的優點OOP的主要優點包括:可重複使用性:OOP可以讓程式碼更

Oracle實例數量與資料庫效能關係Oracle資料庫是業界知名的關係型資料庫管理系統之一,廣泛應用於企業級的資料儲存與管理。在Oracle資料庫中,實例是一個非常重要的概念。實例是指Oracle資料庫在記憶體中的運作環境,每個實例都有獨立的記憶體結構和後台進程,用於處理使用者的請求和管理資料庫的操作。實例數量對於Oracle資料庫的效能和穩定性有著重要的影響。
