簡體   English   中英

Hadoop map-reduce 編程

[英]Hadoop map-reduce programming

我是 Hadoop Map-reduce 的新手。 我的輸入是許多文本文件,我想編寫 map-reduce 程序,以便它將所有文件名和相關的句子與文件名一起寫入一個輸出文件中,我只想在其中發出文件名(key ) 以及來自映射器和化簡器的相關句子(值)將收集鍵和所有值,並在輸出中寫入文件名及其相關句子。

映射器和減速器:

public void map(Text key, Text value,
                OutputCollector<Text, Text> output,
                Reporter reporter) throws IOException {
    StringTokenizer itr = new StringTokenizer(value.toString(), ",");
    String filename = new String();
    FileSplit filesplit = (FileSplit) reporter.getInputSplit();
    filename = filesplit.getpath().getName();
    while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        output.collect(new Text(filename), word);
    }
}

public void reduce(Text key, Iterator<Text> values,
                   OutputCollector<Text, Text> output,
                   Reporter reporter) throws IOException {
    // int sum = 0;
    String translation = "";
    while (values.hasNext()) {
        translation += "|" + values.toString() + "|";
    }

    results.set(translation);
    output.collect(key, results);
}

當我使用相同的輸入格式(keyvaluetextinputformat.class)配置運行上述映射器和化簡器時,它不會在輸出中寫入任何內容。

我應該改變什么來實現我的目標?

在您的 reduce 方法中,您將值聲明為迭代器。 它應該被聲明為一個 Iterable 代替。

public void reduce(Text key, Iterable<Text> values, ....

代替

public void reduce(Text key, Iterator<Text> values, ....

完成后,您可以執行以下操作:

Iterator<Text> iter = values.iterator();
while(iter.hasNext())
{
    translation += "|" + iter.next().toString() + "|";
}

因為您使用了錯誤的類型,所以該方法不會覆蓋不執行任何操作的默認 reduce 方法。 這就是為什么你沒有輸出。

我也沒有看到你在哪里聲明變量結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM