данные.

я есть стол 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 ГБ +, и данные, которые я сейчас использую, представляют собой небольшую выборку (789 столбцов х 10000 строк).

Версия Spark 1.6.0

РЕДАКТИРОВАТЬ: сделать заголовок более понятным, добавить проверенные методы вывода

Ответы на вопрос(1)

Ваш ответ на вопрос