1

私は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 です

編集:タイトルをより明確にし、試した出力方法を追加

4

1 に答える 1