我已经在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中?这样,您应该能够将具有类似键的所有单词收集到单个缩减器中。使用组合器检查一些单词计数示例,以了解码合器类的工作方式。