編寫簡單的Hadoop程式(自連線)
阿新 • • 發佈:2018-12-09
準備工作:
如一個列為child,一個列為parent,需要找出grandchile, grandParent
如資料
Lucy Tom
Lucy Jone
Tom Heimi
Tom QiQi
Jone Candy
Jone God
Lucy有四個grandParent:Heimi, QiQi,Candy, God
編寫程式Mapper程式,Mapper中兩次處理輸入資料,類似於SQL中的兩個表,兩個表的關聯列變為key,左表用value值加一個字首1,右表的值加另一個字首2。
public class SelfMapper extends Mapper<LongWritable, Text, Text, Text>{ enum Counter{ LINESKIP } @Override public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{ String line = value.toString(); try { String []arr = line.split(" "); context.write(new Text(arr[1]), new Text("1"+arr[0])); context.write(new Text(arr[0]), new Text("2"+arr[1])); } catch (Exception e) { context.getCounter(Counter.LINESKIP).increment(1); } } }
編寫Reduce程式,Reduce中對value值做處理,座標的value和右表的value做組合即可。
public class SelfReducer extends Reducer<Text,Text,Text,Text>{ @Override public void reduce(Text key, Iterable<Text> values, Context context)throws IOException, InterruptedException{ List<String> childLst = new ArrayList<String>(); List<String> parentLst = new ArrayList<String>(); for(Text t:values){ if(t.toString().substring(0, 1).equals("1")){ childLst.add(t.toString().substring(1, t.toString().length())); }else if(t.toString().substring(0, 1).equals("2")){ parentLst.add(t.toString().substring(1, t.toString().length())); } } for(String child:childLst){ for(String parent:parentLst){ context.write(new Text(child),new Text(parent)); } } }
Map
Main程式參考其他的博文。