данные.
я есть стол 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
РЕДАКТИРОВАТЬ: сделать заголовок более понятным, добавить проверенные методы вывода