我正在尝试了解从以下网站获取的reducer.R代码。
http://www.thecloudavenue.com/2013/10/mapreduce-programming-in-r-using-hadoop.html
此代码用于使用R的Hadoop Streaming。
我已经给出了以下代码:
#! /usr/bin/env Rscript
# reducer.R - Wordcount program in R
# script for Reducer (R-Hadoop integration)
trimWhiteSpace <- function(line) gsub("(^ +)|( +$)", "", line)
splitLine <- function(line) {
val <- unlist(strsplit(line, "\t"))
list(word = val[1], count = as.integer(val[2]))
}
env <- new.env(hash = TRUE)
con <- file("stdin", open = "r")
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {
line <- trimWhiteSpace(line)
split <- splitLine(line)
word <- split$word
count <- split$count
if (exists(word, envir = env, inherits = FALSE)) {
oldcount <- get(word, envir = env)
assign(word, oldcount + count, envir = env)
}
else assign(word, count, envir = env)
}
close(con)
for (w in ls(env, all = TRUE))
cat(w, "\t", get(w, envir = env), "\n", sep = "")
有人可以解释使用以下new.env命令的重要性以及随后在代码中使用env:
env <- new.env(hash = TRUE)
为什么需要这个?如果这不包含在代码中会发生什么?
2014年6月5日更新
我尝试编写此代码的另一个版本,但没有定义新的环境,并给出了如下代码:
#! /usr/bin/env Rscript
current_word <- ""
current_count <- 0
word <- ""
con <- file("stdin", open = "r")
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0)
{
line1 <- gsub("(^ +)|( +$)", "", line)
word <- unlist(strsplit(line1, "[[:space:]]+"))[[1]]
count <- as.numeric(unlist(strsplit(line1, "[[:space:]]+"))[[2]])
if (current_word == word) {
current_count = current_count + count
} else
{
if(current_word != "")
{
cat(current_word,'\t', current_count,'\n')
}
current_count = count
current_word = word
}
}
if (current_word == word)
{
cat(current_word,'\t', current_count,'\n')
}
close(con)
此代码提供与定义新环境的输出相同的输出。
问题:使用新环境是否从Hadoop角度提供了任何优势?是否有理由在这种特定情况下使用它?
谢谢。
答案 0 :(得分:3)
您的问题与R中的环境有关,R中的新环境的示例代码
> my.env <- new.env()
> my.env
<environment: 0x114a9d940>
> ls(my.env)
character(0)
> assign("a", 999, envir=my.env)
> my.env$foo = "This is the variable foo."
> ls(my.env)
[1] "a" "foo"
我认为这篇文章可以帮助你http://www.r-bloggers.com/environments-in-r/ 或者按
?environment
获取更多帮助
就像你提供的代码一样,作者创造了一个新的环境。
env <- new.env(hash = TRUE)
当他想要分配价值时,他们定义了环境
assign(word, oldcount + count, envir = env)
对于问题&#34;如果代码中没有包含这个问题,会发生什么?&#34;我想你可以在我已提供的链接上找到答案
关于在R中使用新env的优势已在this link
中得到解答因此,在这种情况下,您将使用大量数据集,当您将数据集传递给函数时,R将复制数据集,然后返回数据将覆盖旧数据集。但是如果你传递env,R将直接处理该env而不复制大数据集。