R-Conomics

¿Por qué usar SQL?

En estos días he trabajado con algunas bases de datos en MySQL y he notado que no hay demasiada información en internet sobre formas para conectar dichas bases de datos a R y Rstudio. Estaba previsto que haría este tutorial en un futuro próximo, sin embargo, al ver la cantidad de información tan limitada que hay en la web sobre esto, creo que es momento de hacer un tutorial al respecto.

Me parece algo bastante necesario que las personas conozcan como conectar una base de datos, ya que de esta manera podrán manejar dicha información desde R y poder crear gráficos, modelos, etc.

Ahora bien, ¿por qué conectarse a una base de SQL y no simplemente utilizar Excel, Sheets, o algún gestor de hojas de cálculo? Yo mismo me hice esa pregunta cuando comencé a aprender SQL. Cuando comienzas a trabajar con bases de datos que contienen grandes volúmenes de información, pero sobre todo, bases que pueden contener información delicada de una empresa, lo último que quieres hacer es hacer eso en un archivo de Excel o Google Sheets, ya que son sumamente vulnerables a cambios, caso contrario a SQL, donde existe un alto nivel de seguridad, en el que, además, necesitas saber programar en este lenguaje para poder hacer cambios a una base de datos, lo que elimina casi por completo las situaciones en las que, por un error de dedo, algo daña la información con la que se está trabajando. De igual manera, trabajar con macros en Excel/Sheets es útil, pero son muy suceptibles a fallar. Está de más decir que éstos dos programas mencionados no son gestores de bases de datos, si no que son hojas de cálculo, sirven para hacer cálculos, inventarios pequeños, etc, pero no están diseñadas para almacenar volúmenes altos de información que puedan ser compartidos con mucha gente.

Ahora, si únicamente trabajas con tablas pequeñas, información de INEGI, BANXICO, etc, tal vez no sea tan necesario para ti utilizar SQL para gestionar esa información, sin embargo, cuando quieres utilizar mucha información a la vez, en este caso si es recomendable almacenarla en una base de datos de SQL. Te pongo como ejemplo esta situación que me ocurrió a mi hace un tiempo: Estuve trabajando en una app de seguimiento económico y la app contaba con aproximádamente 40 bases tablas de información que la alimentaban. Decidí trabajar en Excel, pero eso implicaba que cada que actualizara la información yo tenía que volver a subir la app, por lo que requería una forma de tener esa información en la nube. La solución más rápida (aunque no tanto) fue trasladar esas tablas a hojas de cálculo de Google Sheets y conectarlas a R con el paquete googlesheets4, el cual en realidad funciona bastante bien. El problema aquí es que al leer las tablas, cada una de ellas se encontraba en una hoja de cálculo distinta, además de que el paquete tarda aproximadamente 2 segundos en leer cada hoja de cálculo, lo que implicaba que al final la app tardara cerca de 2 minutos en iniciarse. En este tipo de situaciones es donde debes plantearte seriamente el utilizar SQL en lugar de hojas de cálculo.

MySQL en R

Para éste tutorial utilizaremos el paquete RMySQL, con el que generaremos una conexión con el programa para poder utilizar las tablas que tengamos en una base de datos de SQL. Por otra parte, utilizaremos MySQL Workbench como gestor para trabajar con las bases de datos.

Requisitos previos

  1. Tener instalado MySQL
  2. Tener instalado R/Rstudio y el paquete RMySQL.
  3. Tener instalado MySQL Workbench (opcional, se puede usar el gestor con el que uno se acomode mejor).
  4. Tener iniciado el servidor de MySQL en la configuración de la computadora (opcional, esto solo se hace si se utilizan datos en modo local).
  5. Tener una cuenta de Amazon Web Services (para la conexión en la nube).

Configuración y conexión en modo local

En primer lugar, una vez que tengamos descargado MySQL y MySQL Workbench, debemos asegurarnos que nuestra conexión local esté activa en configuración. Tal que:

Considera que este paso solo es necesario para bases de datos que tengamos en un archivo local, por lo que si quieres saber únicamente cómo generar una conexión en AWS, salta a la siguiente parte.

Una vez que tenemos activado MySQL en nuestra PC, simplemente debemos abrir Workbench y crear un archivo local. Para ello, debemos dar en el botón con el signo de más de la pantalla de inicio donde dice MySQL connections, es decir:

A lo cual se nos desplegará una ventana nueva con los parámetros de la conexión que estamos creando. Por el momento vamos a dejar todo por default como está y estableceremos una contraseña en el campo Store in keychain. La ventana debe verse así:

Ahora bien, los datos de dicha conexión son los que utilizaremos para conectar MySQL con R. Para hacer la conexión en realidad es muy sencillo, pero considera que debes tener al menos una base de datos creada dentro de esa conexión (y una tabla), ya que es lo que la función de R va a leer.

Bien, ahora que creamos nuestra base de datos y almenos una tabla para trabajar con ella, podemos generar la conexión con R:

# Cargamos el paquete necesario
library(RMySQL)

# Proporcionamos la información del puerto de la siguiente manera:

options(mysql = list(
  "host" = "127.0.0.1",
  "port" = 3306,
  "user" = "root",
  "password" = "contra establecida"
))

# Nos conectamos a la base de datos
base_mysql <- dbConnect(MySQL(), dbname = "nombredelabase", host = options()$mysql$host, 
                port = options()$mysql$port, user = options()$mysql$user, 
                password = options()$mysql$password)

# Importamos la tabla que necesitamos de MySQL

tabla <- dbGetQuery(base_mysql, sprintf("SELECT * FROM nombredelabase.tabla", table))

Y listo, es todo lo que tenemos que hacer para conectarnos a una base de datos de SQL en modo local.

Notese que dentro de la función dbGetQuery() estamos utilizando código de SQL para importar la tabla que necesitamos dentro de la base de datos. Lo que estamos haciendo es generar un puente entre MySQL y R, por el cual al utilizar el comando de SQL para cargar la tabla de nuestra base de datos, hacemos que en lugar de que se cargue dentro de de Workbench, esta se cargará en nuestra sesión de R.

Generando la conexión en la nube

Si bien es útil saber cómo conectarnos a una base de datos en modo local, probablemente no te encuentras leyendo este tutorial por eso. Lo más eficiente cuando tenemos aplicaciones publicadas en línea es poder actualizar los datos sin la necesidad de tener que volver a subir la aplicación, por lo que para este caso vamos a utilizar el servicio de hosting de Amazon Web Services (AWS). Para ello, comenzaremos creándonos una cuenta personal (procura no escoger una cuenta empresarial), la cual nos da la opción de crear una cuenta gratis por los primeros doce meses. En realidad es un servicio barato, sin embargo, si no quieres pagar después del primer año, puedes migrar tu información a otra cuenta (práctica que no apruebo, pero que igual hago de vez en cuando). Nos pedirá algo de información adicional, como nuestra dirección y una tarjeta de crédito/débito. Nos cobrará 20 pesos solo para verificar que tenemos fondos, pero nos lo devolverá en aproximadamente 12-24 horas.

Una vez creada la cuenta, vamos a entrar a la consola de administración, dando click en el botón naranja de la esquina superior derecha. Nos desplegará una página como ésta:

Vamos a dar click en donde dice Todos los servicios y, después, vamos a dar click en la opción de RDS de la sección de Bases de datos. Tras esto, damos click en el botón naranja donde dice Crear base de datos y después seleccionamos a MySQL mediante una creación estándar. En la sección de plantillas damos click en Capa gratuita y después, en el resto de los campos, asignamos el nombre de usuario y la contraseña (no utilices la creación automática de contraseña, defínela tú). El resto de configuración déjala por default y da click finalmente en Crear base de datos; este proceso va a llevar un rato, así que te recomiendo que vayas por palomitas o algo por el estilo mientras esperas. Una vez creada la base de datos, nos aparecerá una ventana azúl hasta arriba en la cual podremos ver la información de nuestra instancia de bases de datos de MySQL. Todos los datos serán los que nosotros proporcionamos al principio, excepto por el host, el cual en este caso será un link de AWS, algo parecido a your-database.cluster-xxxxxxxxxxxx.aws-region.rds.amazonaws.com. Ahora, una vez creada la instancia, vamos a ir a Workbench y crearemos una conexión nueva como lo hicimos anteriormente, solo que esta vez introduciremos los datos de la instancia que creamos en AWS. En la parte del host simplemente copiamos el link de AWS y lo pegamos ahí, para después dar click en probar conexión. Si todo salió bien, entonces nos saldrá un mensaje de éxito y podremos dar click en OK. Ahora ya podemos introducir bases de datos nuevas e ir creando tablas que se irán almacenando en el host de AWS, por lo que al hacer la conexión con R, podremos agregar valores y éstos se actualizarán automáticamente en, por ejemplo, nuestra app Shiny o el proyecto que estemos haciendo.

Bien, ahora simplemente vamos a generar la conexión con R de la misma manera que lo hicimos anteriormente, con la diferencia de que el host ya no es local, por lo que el código quedará de la siguiente manera:

# Cargamos el paquete necesario
library(RMySQL)

# Proporcionamos la información del puerto de la siguiente manera:

options(mysql = list(
  "host" = "your-database.cluster-xxxxxxxxxxxx.aws-region.rds.amazonaws.com",
  "port" = 3306,
  "user" = "root",
  "password" = "contra establecida"
))

# Nos conectamos a la base de datos
base_mysql <- dbConnect(MySQL(), dbname = "nombredelabase", host = options()$mysql$host, 
                port = options()$mysql$port, user = options()$mysql$user, 
                password = options()$mysql$password)

# Importamos la tabla que necesitamos de MySQL

tabla <- dbGetQuery(base_mysql, sprintf("SELECT * FROM nombredelabase.tabla", table))

Y listo, ahora establecimos una conexión exitosa con datos en la nube utilizando MySQL.

¡Muchas gracias por tomarte la molestia de leerme. Espero que tengas mucho éxito con tu trabajo!

Referencias

[1] Villamizar, M., Garces, O., Ochoa, L., Castro, H., Salamanca, L., Verano, M., … & Lang, M. (2016, May). Infrastructure cost comparison of running web applications in the cloud using AWS lambda and monolithic and microservice architectures. In 2016 16th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing (CCGrid) (pp. 179-182). IEEE.

[2] DuBois, P. (2008). MySQL. Pearson Education.

[3] Widenius, M., Axmark, D., & Arno, K. (2002). MySQL reference manual: documentation from the source. " O’Reilly Media, Inc.".

[4] Schwartz, B., Zaitsev, P., & Tkachenko, V. (2012). High performance MySQL: optimization, backups, and replication. " O’Reilly Media, Inc.".

[5] Cattell, R. (2011). Scalable SQL and NoSQL data stores. Acm Sigmod Record, 39(4), 12-27.

R-Conomics
Todos los derechos reservados