R は初めてです。Java で map reduce を書く方法を知っています。Rで同じことを試してみたいので、サンプルコードを提供するのに役立つ人はいますか?RのMapReduceの固定形式はありますか?
これ以外のリンクを送信してください: https://github.com/RevolutionAnalytics/RHadoop/wiki/Tutorial
サンプルコードはより役に立ちます。
R は初めてです。Java で map reduce を書く方法を知っています。Rで同じことを試してみたいので、サンプルコードを提供するのに役立つ人はいますか?RのMapReduceの固定形式はありますか?
これ以外のリンクを送信してください: https://github.com/RevolutionAnalytics/RHadoop/wiki/Tutorial
サンプルコードはより役に立ちます。
Map Reduce (Hadoop を使用) を Java 以外の言語で実装する場合は、ストリーミングと呼ばれる機能を使用します。次に、データは STDIN (readLines()) 経由でマッパーに供給され、STDOUT (cat()) 経由で Hadoop に戻され、次に STDIN (readLines()) 経由で再びレデューサーに供給され、最後に STDOUT (cat()) 経由でブラートされます。
次のコードは、Hadoop 用の R を使用して map reduce ジョブを作成する方法について書いた記事から抜粋したものです。コードは 2 グラムをカウントすることになっていますが、MapReduce に関して何が起こっているかを確認するには十分に単純だと思います。
# map.R
library(stringdist, quietly=TRUE)
input <- file("stdin", "r")
while(length(line <- readLines(input, n=1, warn=FALSE)) > 0) {
# in case of empty lines
# more sophisticated defensive code makes sense here
if(nchar(line) == 0) break
fields <- unlist(strsplit(line, "\t"))
# extract 2-grams
d <- qgrams(tolower(fields[4]), q=2)
for(i in 1:ncol(d)) {
# language / 2-gram / count
cat(fields[2], "\t", colnames(d)[i], "\t", d[1,i], "\n")
}
}
close(input)
-
# reduce.R
input <- file("stdin", "r")
# initialize variables that keep
# track of the state
is_first_line <- TRUE
while(length(line <- readLines(input, n=1, warn=FALSE)) > 0) {
line <- unlist(strsplit(line, "\t"))
# current line belongs to previous
# line's key pair
if(!is_first_line &&
prev_lang == line[1] &&
prev_2gram == line[2]) {
sum <- sum + as.integer(line[3])
}
# current line belongs either to a
# new key pair or is first line
else {
# new key pair - so output the last
# key pair's result
if(!is_first_line) {
# language / 2-gram / count
cat(prev_lang,"\t",prev_2gram,"\t",sum,"\n")
}
# initialize state trackers
prev_lang <- line[1]
prev_2gram <- line[2]
sum <- as.integer(line[3])
is_first_line <- FALSE
}
}
# the final record
cat(prev_lang,"\t",prev_2gram, "\t", sum, "\n")
close(input)