我在R中完成了地图缩减代码以在Amazon EMR中运行。
我的输入文件格式:
URL1 word1 word2 word3
URL2 word4 word2 word3
URL3 word1 word7 word2
我希望输出为:URL与空格连接
word1 URL1 URL3
word2 URL1 URL2 URL3
word3 URL1 URL2
.. ... ..
但EMR正在使用3个reducer并创建3个输出文件。文件方式输出是正确的,它是组合值,没有重复键。但是,如果我们一起看到3个文件,则存在重复的密钥。
输出文件1:
word1 URL1 URL3
word2 URL1
.. ..
输出文件2:
word2 URL2 URL3
word3 URL1
.. ..
请参阅word2
分发给2个文件。我需要一个密钥只在一个文件中。
我在EMR中使用Hadoop Streaming。请建议我删除不同文件中的重复键的正确设置。
我认为我的映射器工作正常。这是我的减速机:
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=" ")
}
答案 0 :(得分:0)
您是否尝试使用合成器将相同的键收集到同一个减速器中?这样,您应该能够将具有类似键的所有单词收集到一个reducer中。使用组合器检查一些 wordcount 示例,以了解组合器类的工作原理。