我已经在R中完成了 map 精简代码以在Amazon EMR中运行。

我的输入文件格式:URL1 word1 word2 word3URL2 word4 word2 word3URL3 word1 word7 word2
我期望的输出为:URL与空格连在一起word1 URL1 URL3word2 URL1 URL2 URL3word3 URL1 URL2.. ... ..
但是EMR正在使用3个reducer并创建3个输出文件。从文件的 Angular 来看,输出是正确的,它是组合值,没有重复的键。但是,如果我们一起看到3个文件,则有重复的密钥。

输出文件1:word1 URL1 URL3word2 URL1.. ..
输出文件2:word2 URL2 URL3word3 URL1.. ..
看到,word2被分发到2个文件中。我需要一把 key 只有一个文件。

我正在使用EMR中的Hadoop流。请为我建议正确的设置,以删除不同文件中的重复键。

我认为我的映射器工作正常。这是我的 reducer :

process <- function(mat){

rows = nrow(mat)
cols = ncol(mat)

for(i in 1:rows)
{

    for(j in i+1:rows)
    {
        if(j<=rows)
        {
            if(toString(mat[i,1])==toString(mat[j,1]))
            {
            x<-paste(mat[i,2],mat[j,2],sep=" ")
            mat[i,2]=x
            mat<-mat[-j,]
            rows<-rows-1
            }
        }
    }
}

write.table(mat, file=stdout(), quote=FALSE, row.names=FALSE, col.names=FALSE)
}

reduce <- function(input){
  #create column names to make is easier to work with the data set
  names <- c("word", "value")
  cols = as.list(vector(length=2, mode="character"))
  names(cols) <- names

  #read from the input
  hsTableReader(file=input, cols, ignoreKey=TRUE, chunkSize=100000, FUN=process, sep=" ")


}

最佳答案

您是否尝试过使用组合器将相同的键收集到相同的reducer中?这样,您应该能够将具有类似键的所有单词收集到单个缩减器中。使用组合器检查一些单词计数示例,以了解码合器类的工作方式。

09-07 21:58