Como paralelizar o código R com gapplygapply

A paralelização do código R é difícil, porque o código R funciona no controlador e os dados R.frames não são distribuídos. Muitas vezes, existe um código R existente que é executado localmente e que é convertido para correr em Apache Spark. Noutros casos, algumas funções de SparkR utilizadas para análise estatística avançada e técnicas de machine learning podem não suportar a computação distribuída. Nesses casos, a API sparkr UDF pode ser utilizada para distribuir a carga de trabalho desejada por um cluster.

Exemplo de caso: Pretende formar um modelo de aprendizagem automática em subconjuntos de um conjunto de dados, agrupados por uma chave. Se os subconjuntos dos dados se enquadrarem nos trabalhadores, poderá ser mais eficiente utilizar a API SparkR UDF para formar vários modelos ao mesmo tempo.

As gapply gapplyCollect funções e as funções aplicam uma função a cada grupo num DataFrame de Faísca. Para cada grupo num DataFrame de Faísca:

  1. Colete cada grupo como um quadro R data.frame.
  2. Envie a função ao trabalhador e execute.
  3. Devolva o resultado ao condutor conforme especificado no esquema.

Nota

Quando gapply ligar, deve especificar o esquema de saída. Com gapplyCollect , o resultado é recolhido ao controlador utilizando um quadro R data.frame para a saída.

No exemplo seguinte, um modelo de máquina de vetor de suporte separado está ajustado nos airquality dados para cada mês. A saída é um data.frame com o MSE resultante para cada mês, mostrado com e sem especificar o esquema.

df <- createDataFrame(na.omit(airquality))

schema <- structType(
  structField("Month", "MSE"),
  structField("integer", "Number"))

result <- gapply(df, c("Month"), function(key, x) {
  library(e1071)
  data.frame(month = key, mse = svm(Ozone ~ ., x, cross = 3)$tot.MSE)
}, schema)
df <- createDataFrame(na.omit(airquality))

gapplyCollect(df, c("Month"), function(key, x) {
  library(e1071)
  y <- data.frame(month = key, mse = svm(Ozone ~ ., x, cross = 3)$tot.MSE)
 names(y) <- c("Month", "MSE")
  y
})

Nota

Comece com um Spark DataFrame e instale pacotes em todos os trabalhadores.