2

いくつかのデータを sparkR (Spark バージョン 1.4.0、fedora21 で実行) にロードして、3 つの異なる数値を生成するアルゴリズムを実行しています。私のアルゴリズムは一連のパラメーターを使用し、同じデータに対して異なるパラメーター設定を実行したいと考えています。出力形式はデータフレーム (または csv リスト) である必要があり、その列はアルゴリズムのパラメーターであり、アルゴリズムが計算する 3 つの数値です。つまり、

  mypar1, mypar2, mypar3, myres1, myres2, myres3
  1       1.5     1.2     5.6      8.212  5.9
  2       1.8     1.7     5.1      7.78   8.34

2 つの異なるパラメーター設定の出力になります。以下のスクリプトは、異なるパラメーター設定での実行を並列化するものです。パラメーター値を引数として入力ファイルを受け取ります。上記の例では、次のようになります。

 1,1.5,1.2
 2,1.8,1.7

したがって、1 行に 1 つのパラメータの組み合わせです。

これが私の問題です。パラメーター設定ごとに1つ取得する代わりに、すべての数値が1つの長いリストに結合されます。関数 cv_spark は data.frame (基本的には 1 行) を返します。cv_spark の出力をデータフレーム (つまり、rbind のようなこと) またはリストのリストに結合するように spark に指示するにはどうすればよいですか?

#!/home/myname/Spark/spark-1.4.0/bin/sparkR

library(SparkR)

sparkcontext <- sparkR.init("local[3]","cvspark",sparkEnvir=list(spark.executor.memory="1g"))

cv_spark <- function(indata) {
   cv_params <- strsplit(indata, split=",")[[1]]
   param.par1 = as.integer(cv_params[1])
   param.par2 = as.numeric(cv_params[2])
   param.par3 = as.numeric(cv_params[3])
   predictions <- rep(NA, 1)
   ## here I run some calculation on some data that I load to my SparkR session, 
   ## but for illustration purpose I'm just filling up with some random numbers
   mypred = base:::sample(seq(5,10,by=0.01),3)
   predictions <- cbind(param.par1, param.par2, param.par3,mypred[1],mypred[2],mypred[3])
   return(as.data.frame(predictions))
}

args <- commandArgs(trailingOnly=TRUE)
print(paste("args ", args))
cvpar = readLines(args[[1]])

rdd <- SparkR:::parallelize(sparkcontext, coll=cvpar, numSlices=4)
myerr <- SparkR:::flatMap(rdd,cv_spark)
output <- SparkR:::collect(myerr)
print("final output")
print(output)

outfile = "spark_output.csv"
write.csv(output,outfile,quote=FALSE,row.names=FALSE)
4

1 に答える 1