2016-09-19 20 views
2

我是hadoop和mapreduce編程中的新成員,不知道該怎麼辦。我想在hadoop分區器中定義一個int數組。我想感受這個數組在main函數中的作用,並在分區器中使用它的內容。我試圖使用IntWritable和它的數組,但他們都沒有工作。我試圖使用IntArrayWritable,但它再次沒有奏效。如果有人幫助我,我會很高興。非常感謝如何在hadoop分區器中定義數組

public static IntWritable h = new IntWritable[1]; 

public static void main(String[] args) throws Exception { 
    h[0] = new IntWritable(1); 
} 

public static class CaderPartitioner extends Partitioner <Text,IntWritable> { 

    @Override 
    public int getPartition(Text key, IntWritable value, int numReduceTasks) { 
     return h[0].get(); 
    } 
} 

回答

1

如果您的數值有限,您可以按照以下方式進行操作。 在main方法中設置如下配置對象的值。從它的分區程序

public class testPartitioner extends Partitioner<Text, IntWritable> implements Configurable{ 

Configuration config = null; 

@Override 
public int getPartition(Text arg0, IntWritable arg1, int arg2) { 

    //get your values based on the keys in the partitioner 
    int value = getConf().getInt("key"); 
    //do stuff on value 

    return 0; 
} 

@Override 
public Configuration getConf() { 
    // TODO Auto-generated method stub 
    return this.config; 
} 

@Override 
public void setConf(Configuration configuration) { 
    this.config = configuration; 

} 
} 

支持鏈接,如果您有 https://cornercases.wordpress.com/2011/05/06/an-example-configurable-partitioner/

筆記裏面

Configuration conf = new Configuration(); 
    conf.setInt("key1", value1); 
    conf.setInt("key2", value2); 

然後實現可配置界面爲你分區程序類,並獲取配置對象,那麼鍵/值在一個文件中有大量的值然後更好地找到一種方法來從分區器中的作業對象中獲取緩存文件

1

這裏是重構版本的分區器。主要的變化是:

  1. 即將移除其心不是需要main(),初始化應該在構造函數中
  2. 從類和成員變量

public class CaderPartitioner extends Partitioner<Text,IntWritable> { 

    private IntWritable[] h; 

    public CaderPartitioner() { 
     h = new IntWritable[1]; 
     h[0] = new IntWritable(1); 
    } 

    @Override 
    public int getPartition(Text key, IntWritable value, int numReduceTasks) { 
     return h[0].get(); 
    } 
} 

註釋去掉靜態完成:

  • h不需要是可寫的,除非您在問題中沒有包含其他邏輯。
  • 目前尚不清楚h[]的用途是什麼,你打算如何配置它?在這種情況下,分區器可能需要implement Configurable,因此您可以使用Configurable對象以某種方式設置陣列。
+0

謝謝。但我想從主函數感受h [0]。主要功能是具有配置代碼。例如我有臨時[0],在主要功能我修改它。那麼我想在分區器中將temp [0]複製到h [0]。謝謝 – saeednasehi

+0

你不能使用'main()'方法。您需要封裝分區器中的所有內容。 –

+0

非常感謝。我有一個文件,有一些關鍵和減少數量。我想讀這個文件,並使用這些信息來決定每個鍵的reducer。你有意見幫助我做到這一點嗎? – saeednasehi