Taiwan Hadoop Forum

台灣 Hadoop 技術討論區
現在的時間是 2022-07-02, 12:19

所有顯示的時間為 UTC + 8 小時




發表新文章 回覆主題  [ 4 篇文章 ] 
發表人 內容
 文章主題 : 請教:map出來後指定某一個reduce處理
文章發表於 : 2013-06-06, 13:51 
離線

註冊時間: 2013-06-06, 13:39
文章: 2
package prosq;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.TreeSet;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;

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.conf.*;
import org.apache.hadoop.mapreduce.Reducer.Context;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.*;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapred.*;


public class sequence {
public static void main(String[] args) throws Exception
{
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf,args) .getRemainingArgs();
if (otherArgs.length != 2)
{
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "sequence");
job.setJarByClass(sequence.class);
job.setMapperClass(sqmap.class);
job.setNumReduceTasks(2);
job.setCombinerClass(sqreduce.class);
job.setReducerClass(sqreduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setPartitionerClass(MyPartitionerPar.class); //出現錯誤

FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}

public static class MyPartitionerPar implements Partitioner<Text, IntWritable> {
@Override
public int getPartition(Text key, IntWritable value, int numPartitions) {

String reKey=key.toString();
String kList=reKey.substring(1,reKey.length()-1);
String ListLar[]=kList.split(",");
int i = Integer.valueOf(ListLar[0]).intValue();
return i%numPartitions;
}

@Override
public void configure(JobConf arg0)
{
// TODO Auto-generated method stub
}
}
public static class sqreduce extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for(IntWritable val : values){
sum += val.get();
}
if(sum>=2){
result.set(sum);
context.write(key, result);
}
}
}

public class sqmap extends Mapper<Object, Text, Text, IntWritable> {
private final IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {

TreeSet<String> set = new TreeSet<String> ();
StringTokenizer itr = new StringTokenizer(value.toString(),",");
while (itr.hasMoreTokens())
{
set.add(itr.nextToken());
}
ArrayList<TreeSet<String>> subset = getSubset(set);
for(TreeSet<String> ts : subset)
{
if(ts.toString()!="[]"){
word.set(ts.toString());
context.write(word, one);
}
}


}

public String[] getBinaryValue(TreeSet<String> set)
{
int size = set.size();
int m = (int)Math.pow(2,size) - 1;//2的size次方
String[] result = new String[m+1];
for(int i=m;i>-1;i--)
{
StringBuffer sb = new StringBuffer(Integer.toBinaryString(i));
int length = sb.length();
if(length < size)
{
for(int j=0;j<size-length;j++)
{
sb.insert(0, "0");
}
}
result[i] = sb.toString();
}
return result;
}

public ArrayList<TreeSet<String>> getSubset(TreeSet<String> set)
{
ArrayList<TreeSet<String>> result = new ArrayList<TreeSet<String>> ();
String[] items = new String[set.size()];
int i = 0;
for(String item : set)
{
items[i++] = item;
}
String[] binaryValue = getBinaryValue(set);
System.out.println(binaryValue);
for(int j=0;j<binaryValue.length;j++)
{
String value = binaryValue[j];
TreeSet<String> subset = new TreeSet<String> ();
for(int k=0;k<value.length();k++)
{
if(value.charAt(k) == '1') subset.add(items[k]);
}
result.add(subset);
}
return result;
}
}
}


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 請教:map出來後指定某一個reduce處理
文章發表於 : 2013-06-08, 01:33 
離線

註冊時間: 2012-09-17, 23:06
文章: 47
好像只有程式碼,會不清楚如何解這樣錯誤,

加上錯誤訊息,是不是會更容易看出端倪,

額外附上輸入檔,想達到怎樣的輸出?

可否提供一下,也比較好除錯。


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 請教:map出來後指定某一個reduce處理
文章發表於 : 2013-06-11, 01:33 
離線

註冊時間: 2009-11-09, 19:52
文章: 2897
代碼:
    [javac] /home/jazz/code/src/sequence.java:42: setPartitionerClass(java.lang.Class<? extends org.apache.hadoop.mapreduce.Partitioner>) in org.apache.hadoop.mapreduce.Job cannot be applied to (java.lang.Class<prosq.sequence.MyPartitionerPar>)
    [javac]       job.setPartitionerClass(MyPartitionerPar.class); //出現錯誤
    [javac]          ^


請不要混用 org.apache.hadoop.mapred.Partitioner (Interface,舊 API) 跟 org.apache.hadoop.mapreduce.Partitioner (Class,新 API)

修正:
(1) 移除 import org.apache.hadoop.mapred.*; (因為這是舊 API 的實作)
(2) 新增 import org.apache.hadoop.mapreduce.Partitioner; (這才是正確的類別)
(3) 移除 public void configure(JobConf arg0) (因為這是舊 API 的實作)

代碼:
~/code$ diff -Naur src/sequence.java.bak src/sequence.java
--- src/sequence.java.bak   2013-06-11 01:32:58.000000000 +0800
+++ src/sequence.java   2013-06-11 01:35:36.000000000 +0800
@@ -16,9 +16,9 @@
import org.apache.hadoop.mapreduce.Reducer.Context;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
+import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.util.*;
import org.apache.hadoop.io.IntWritable;
-import org.apache.hadoop.mapred.*;
 

public class sequence {
@@ -46,7 +46,7 @@
      System.exit(job.waitForCompletion(true) ? 0 : 1);
   }
   
-   public static class MyPartitionerPar implements Partitioner<Text, IntWritable> {
+   public static class MyPartitionerPar extends Partitioner<Text, IntWritable> {
      @Override
         public int getPartition(Text key, IntWritable value, int numPartitions) {
           
@@ -56,12 +56,6 @@
            int i =  Integer.valueOf(ListLar[0]).intValue();
             return i%numPartitions;
         }
-      
-      @Override
-      public void configure(JobConf arg0)
-      {
-         // TODO Auto-generated method stub
-      }
   }
   public static class sqreduce extends Reducer<Text, IntWritable, Text, IntWritable> {
      private IntWritable result = new IntWritable();


- Jazz


回頂端
 個人資料 E-mail  
 
 文章主題 : Re: 請教:map出來後指定某一個reduce處理
文章發表於 : 2013-10-07, 23:46 
離線

註冊時間: 2013-06-06, 13:39
文章: 2
感謝兩位高手替小弟解決問題
我懂了


回頂端
 個人資料 E-mail  
 
顯示文章 :  排序  
發表新文章 回覆主題  [ 4 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 2 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
正體中文語系由 竹貓星球 維護製作