Sparklyr: como centralizar uma tabela Spark com base na coluna?
Eu tenho uma tabela 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 ...
e um identificador chamadosimX_tbl
no ambiente R que está conectado a estesimx
mesa.
Eu quero fazer uma centralização para esta tabela, que está subtraindo cada coluna com seus meios de coluna. Por exemplo, calculandox0 - mean(x0)
, e assim por diante.
Até agora, meu melhor esforço é:
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) )
}
Isso realmente funciona quando eu limite ofor
loop para poucas iterações (1:5
) ax_centered %>% head
resultado está correto. Mas quando faço isso para 789 iterações, esse erro ocorre quando tentohead
isto:
Error: C stack usage 7969412 is too close to the limit
Abaixo estão os métodos de saída que eu já tentei que mostram o erro de uso da pilha 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
Posteriormente, preciso calcular o coeficiente de correlação para cada coluna, mas não acho que possa gerar esse erro.
Existe alguma maneira de fazer isso centralizando corretamente / eficientemente? Eu liessa questão sobre aumentar o limite de Cstack, mas não acho que seja uma solução, porque os dados são muito grandes e existe o risco de superlimitar novamente com dados maiores. Os dados reais têm mais de 40 GB e os dados que estou usando atualmente são apenas uma pequena amostra (789 colunas x 10.000 linhas).
A versão do Spark é 1.6.0
EDIT: torne o título mais claro, adicione métodos de saída testados