Nuevas equivalencias (y diferencias) en los paquetes DBI y Dplyr en R (1)

Parece ser que es complicado el manipular una colección de datos que regresa una consulta realizada usando el paquete dplyr junto con Apache Spark, al decir complicado, me refiero a que no podemos manipularlo al igual que un dataframe que tiene características muy parecidas a una tabla o colección de otro lenguaje de programación.

Me clavé en una investigación que me llevó algunas horas (2 o 3) y aunque todavía no encuentro algo concluyente parece ser que no es posible traer los elementos individuales de dicha colección, pareciera que  es debido al gran tamaño que pueden tener.

La siguiente información viene del sitio "RDD Programming Guide - Spark 3.3.0 Documentation" que documenta las acciones que se tienen para manipular estos datasets y según comparándola con otra bibliografía collect() transforma el RDD en un objeto de R para nuestro caso.

"collect() - Regresa todos los elementos del dataset como un arreglo en el controlador (driver) del programa. Esto es usualmente útil después de filtrar o ejecutar otra operación que regrese un subconjunto de datos suficientemente pequeño".

Veamos lo que les menciono a través de este ejemplo:


 La consulta anterior devuelve las viviendas que tienen más de 3 baños junto con el dato trimestre, si queremos mostrar el resultado, en la consola de R vamos a escribir el nombre del objeto y presionamos la tecla "Enter".



Por lo que si quiero accesar al primer registro como si fuera un dataframe de R, marca lo siguiente:

> query2[1,1]

Error in `[.tbl_spark`(query2, 1, 1) : unused argument (1)

Como lo mencioné al principio me di a la tarea de buscar con más profundidad esta situación ya que en mi imaginario creía que se podían accesar elementos individuales de los RDD, entonces en un sitio de la Universidad de Údine algún profesor elaboró una guía de R para ciencia de datos y nos dice lo siguiente:

"Hay muchas razones por la que tu podrías querer mover tus datos de Spark a R. Ya has visto como algunos datos se mueven de Spark a R cuando quieres imprimirlos. Necesitas también obtener tu conjunto de datos (dataset) si tu quieres graficarlo, o si quieres usar una técnica de modelado que no este disponible en Spark.

  • 'copy_to()'  convierte tus datos de R a Spark.
  • 'collect()' convierte tus datos de Spark a R."

Entonces aplicamos la acción collect() para tratarlo como dataframe.



Aquí podemos observar la diferencia entre ambos objetos con la función class.

> class(query2)

[1] "tbl_spark" "tbl_sql"   "tbl_lazy"  "tbl"      

> class(query3)

[1] "tbl_df"     "tbl"        "data.frame"

Sin embargo no había reparado para el caso de la consulta con el paquete DBI, aquí recreo la misma consulta usando SQL.

Es decir DBI regresa directamente un dataframe.

Tenía entendido y debido a un comentario que nuestro gurú de R que la literatura recomendaba dplyr sobre DBI por su facilidad de uso y que supongo que también derivado de lo que dice el texto de "Mastering Spark with R" en el capítulo 2:

"Cuando usamos dplyr, escribes menos código y es a menudo mucho más fácil de escribir que SQL. Es precisamente por esto que no usaremos SQL en este libro; aunque si tu eres experto en SQL, es viable esta opción para ti (usar el paquete DBI)" 

Otro de mis conflictos era que una vez hecha la consulta en dlpyr era que los resultados eran mandados a memoria secundaria (archivos CSV por ejemplo) y luego manipulados con R cuando podemos ver que con DBI directamente recibimos un dataframe y trabajar cada uno de sus elementos,

En el siguiente artículo vamos a ver como extraer los cabeceros de un archivo de texto para después obtener su tipo de datos en un primer acercamiento.

Miguel Araujo.

Referencias

Página de Apache Spark

https://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds

Materiales de Massimo Franceschet de la Universidad de Údine

https://users.dimi.uniud.it/~massimo.franceschet/ds/syllabus/learn/bigdata/Spark/Spark.html

Libro "Mastering Spark with R"

Javier Luraschi, Kevin Kuo, Edgar Ruiz

https://therinspark.com/starting.html#starting-sparklyr-hello-world




Comentarios

Entradas populares de este blog

Librería de REDATAM para R

Conectar bases de datos Oracle con R vía JDBC

Red 7 Admin