domingo, 3 de junio de 2018

R en Spark


Podemos utilizar R en Spark.

Primero debemos instalar R, yo lo voy a instalar en ubuntu:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

sudo add-apt-repository 'deb [arch=amd64,i386] https://cran.rstudio.com/bin/linux/ubuntu xenial/'

sudo apt-get update

sudo apt-get install r-base

sudo -i R

con este ultimo comando inicializamos R, ahora vamos a instalar txtplot para poder graficar en la consola.

install.packages('txtplot')

podemos probar esto con la siguiente linea:

library('txtplot')
txtplot(cars[,1], cars[,2], xlab = "speed", ylab = "distance")

Ahora salimos de r con q()

Nos ubicamos en el directorio bin de spark y ejecutamos

./sparkR

y si todo fue bien veras algo así:

Welcome to
    ____              __
   / __/__  ___ _____/ /__
  _\ \/ _ \/ _ `/ __/  '_/
 /___/ .__/\_,_/_/ /_/\_\   version  2.2.1
    /_/


 SparkSession available as 'spark'.

Y bueno, ahora a probarlo!!

podemos probar con el mismo codigo que probamos la instalación de r :

library('txtplot')
txtplot(cars[,1], cars[,2], xlab = "speed", ylab = "distance")

pero no vamos a estar utilizando la potencia de spark.

Vamos a leer un archivito que se llama customers.txt y tiene los siguientes datos:

$ cat customers.txt
100,John Smith, Austin, TX, 78727
200,Joe Johnson, Dallas, TX, 75201
300,Bob Jones, Houston, TX, 77028
400,Andy Davis, San Antonio, TX, 78227
500,James Williams, Austin, TX, 78727

Que corresponden a la estructura:

customer_id: Int, name: String, city: String, state: String, zip_code: String


> csvPath <- “../../customers.txt”
> df <- read.df(csvPath, "csv", header = "false", inferSchema = "true", na.strings = "NA")
> df
SparkDataFrame[_c0:int, _c1:string, _c2:string, _c3:string, _c4:double]

Leímos el archivo como no tiene cabecera, los campos nos quedan como "_c0", "_c1" ... De igual manera para el ejemplo nos sirve.

Vamos contar cuentos clientes tenemos por zip y luego lo imprimimos :

> groupByZip <- summarize(groupBy(df, df$"_c4"), count = n(df$"_c4"))
>  head(groupByZip)
    _c4 count
1 75201     1
2 77028     1
3 78227     1
4 78727     2

Dejo link:
https://spark.apache.org/docs/latest/sparkr.html