私はSparkテーブルを持っています:
simx
x0: num 1.00 2.00 3.00 ...
x1: num 2.00 3.00 4.00 ...
...
x788: num 2.00 3.00 4.00 ...
このテーブルsimX_tbl
に接続されている R 環境で名前が付けられたハンドル。simx
このテーブルのセンタリングを行いたいと思います。これは、各列をその列の平均で減算することです。たとえば、 などを計算x0 - mean(x0)
します。
これまでのところ、私の最善の努力は次のとおりです。
meanX <- simX_tbl %>% summarise_all(funs("mean")) %>% collect()
x_centered <- simX_tbl
for(i in 1:789) {
colName <- paste0("x", i-1)
colName2 <- lazyeval::interp(~ a - b, a = as.name(colName), b = as.double(meanX[i]))
x_centered <- x_centered %>% mutate_(.dots = setNames( list(colName2) , colName) )
}
for
これは、ループを数回の反復に制限すると実際に機能します ( 1:5
)x_centered %>% head
結果は正しいです。しかし、これを 789 回繰り返して実行すると、次のエラーが発生しますhead
。
Error: C stack usage 7969412 is too close to the limit
以下は、Cスタック使用エラーを示す、私がすでに試した出力方法です。
x_centered %>% head #show first 6 rows
x_centered %>% select_("x0") #select first column only
x_centered %>% sdf_register("x_centered") #register as table
x_centered %>% spark_dataframe() %>% tbl(sc, "x_centered") #also register as table
spark_write_csv(x_centered, path = "hdfs/path/here") #write as csv
後で各列の相関係数を計算する必要がありますが、このエラーで出力できるとは思いません。
このセンタリングを正しく/効率的に行う方法はありますか? Cstack制限の引き上げに関するこの質問を読みましたが、データが非常に大きく、より大きなデータで再び制限を超えるリスクがあるため、解決策ではないと思います. 実際のデータは 40 GB 以上で、現在使用しているデータはほんの一部です (789 列 x 10000 行)。
Spark のバージョンは 1.6.0 です
編集:タイトルをより明確にし、試した出力方法を追加