Parallellisera R-kod med gapply

Parallellisering of R Code är svårt eftersom R-koden körs på driv rutinen och R-data. bild rutor distribueras inte. Det finns ofta en befintlig R-kod som körs lokalt och som konverteras för att köras på Apache Spark. I andra fall kanske vissa spark-funktioner som används för avancerad statistisk analys och Machine Learning-tekniker inte stöder distribuerad data behandling. I sådana fall kan UDF-API: t för Spark användas för att distribuera önskad arbets belastning i ett kluster.

Exempel på användnings fall: du vill träna en maskin inlärnings modell på del mängder av en data uppsättning, grupperad efter en nyckel. Om del mängderna av data får plats i arbets tagarna kan det vara mer effektivt att använda Spark-API: et för att träna flera modeller på samma gång.

gapplyFunktionerna och gapplyCollect använder en funktion för varje grupp i en spark-DataFrame. För varje grupp i en spark-DataFrame:

  1. Samla in varje grupp som R-data. Frame.
  2. Skicka funktionen till arbets tagaren och kör.
  3. Returnera resultatet till den driv rutin som anges av schemat.

Anteckning

När du anropar gapply måste du ange utdata-schemat. Med gapplyCollect samlas resultatet in i driv rutinen med hjälp av en R-data. ram för utdata.

I följande exempel passar en separat support vektor dator modell för airquality data för varje månad. Utdata är en data. ram med den resulterande MSE-koden för varje månad, som visas både med och utan att ange schemat.

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
})

Anteckning

Börja med en spark-DataFrame och installera paket på alla arbetare.