Introducción RODBC Ejemplo Gestión de Bases de Datos con R Antonio Miñarro [email protected] Departament d’Estadı́stica Junio, 2013 A. Miñarro Bases de Datos con R Junio, 2013 1 / 23 Introducción RODBC Ejemplo Esquema del tema 1 Introducción 2 RODBC 3 Ejemplo A. Miñarro Bases de Datos con R Junio, 2013 2 / 23 Introducción RODBC Ejemplo Esquema del tema 1 Introducción 2 RODBC 3 Ejemplo A. Miñarro Bases de Datos con R Junio, 2013 3 / 23 Introducción RODBC Ejemplo Importación y Exportación de datos Ficheros de texto: scan, read.fwf, read.table, read.ftable, read.csv, readLines. Importar de otros sistemas estadı́sticos: read.S, read.spss, read.dta, read.octave (foreign package) Bases de datos relacionales (RDBMS) A. Miñarro Bases de Datos con R Junio, 2013 4 / 23 Introducción RODBC Ejemplo Importación y Exportación de datos Ficheros de texto: scan, read.fwf, read.table, read.ftable, read.csv, readLines. Importar de otros sistemas estadı́sticos: read.S, read.spss, read.dta, read.octave (foreign package) Bases de datos relacionales (RDBMS) A. Miñarro Bases de Datos con R Junio, 2013 4 / 23 Introducción RODBC Ejemplo Importación y Exportación de datos Ficheros de texto: scan, read.fwf, read.table, read.ftable, read.csv, readLines. Importar de otros sistemas estadı́sticos: read.S, read.spss, read.dta, read.octave (foreign package) Bases de datos relacionales (RDBMS) A. Miñarro Bases de Datos con R Junio, 2013 4 / 23 Introducción RODBC Ejemplo Bases de datos relacionales (1) Están especı́ficamente diseñadas para trabajar con grandes conjuntos de datos. Permiten un acceso rápido a partes seleccionadas de la base de datos Permiten sumarizar y cruzar información de los campos Superan las restricciones de almacenaje tı́picas de las hojas de cálculo Permiten un acceso simultáneo de diversos clientes sobre diferentes máquinas y con controles de seguridad Permiten actuar como servidor de una gran variedad de clientes La utilización conjunta de R y DBMS’s incrementa la potencia de ambos sistemas. A. Miñarro Bases de Datos con R Junio, 2013 5 / 23 Introducción RODBC Ejemplo Bases de datos relacionales (2) Tradicionalmente han coexistido grandes RDBMS: Oracle, IBM DB2, Microsoft SQL Server; con otros más pequeños adaptados a ámbitos más modestos: Microsoft Access, MySQL, etc. Actualmente la división se está desvaneciendo con las nuevas versiones de MySQL u otros gestores que se acercan a los rendimientos de los grandes RDBMS. El standard que nos permite comunicar con todas estas fuentes de datos es el ODBC (Open Database Connectivity), y permite conexiones también con hojas de cálculo, bases de datos no-relacionales o incluso ficheros de texto comprimidos. A. Miñarro Bases de Datos con R Junio, 2013 6 / 23 Introducción RODBC Ejemplo El lenguaje SQL Generalmente las bases de datos residirán en ordenadores diferentes al nuestro y la comunicación se logra a través de un lenguaje standard SQL (Structured Query Language) soportado por la mayorı́a de DBMS. Es necesario utilizar instrucciones especı́ficas del lenguaje para operar con las bases de datos Por ejemplo Ejemplo de instrucción SQL SELECT columna1 columna2 FROM Tabla1 WHERE columna3 > 20 ORDER BY columna2 A. Miñarro Bases de Datos con R Junio, 2013 7 / 23 Introducción RODBC Ejemplo El lenguaje SQL Generalmente las bases de datos residirán en ordenadores diferentes al nuestro y la comunicación se logra a través de un lenguaje standard SQL (Structured Query Language) soportado por la mayorı́a de DBMS. Es necesario utilizar instrucciones especı́ficas del lenguaje para operar con las bases de datos Por ejemplo Ejemplo de instrucción SQL SELECT columna1 columna2 FROM Tabla1 WHERE columna3 > 20 ORDER BY columna2 A. Miñarro Bases de Datos con R Junio, 2013 7 / 23 Introducción RODBC Ejemplo Esquema del tema 1 Introducción 2 RODBC 3 Ejemplo A. Miñarro Bases de Datos con R Junio, 2013 8 / 23 Introducción RODBC Ejemplo R interface packages En el CRAN existen algunos packages especı́ficos de un tipo de base de datos: ROracle, RPostgreSQL, RJDBC, RSQLite, RMySQL Existen algunos de ámbito general: RODBC permite una comunicación con fuentes de bases de datos compatibles con ODBC A. Miñarro Bases de Datos con R Junio, 2013 9 / 23 Introducción RODBC Ejemplo RODBC package Proporciona una interfaz de conexión con bases de datos compatibles con ODBC Corre sobre Windows/Unix/Linux/OS X y sobre casi todos los DBMS Windows proporciona drivers no únicamente para DBMS sino también para Excel, DBase y ficheros de texto Necesita la instalación previa y carga del package En algún caso puede necesitar la instalación de drivers ODBC especı́ficos para la plataforma y BD. Por ejemplo para instalar conectividad con MySQL en Windows podemos encontrar el driver en http://dev.mysql.com/downloads/connector/odbc/ > install.packages('RODBC') > library(RODBC) A. Miñarro Bases de Datos con R Junio, 2013 10 / 23 Introducción RODBC Ejemplo Esquema general de trabajo Abrir conexión con una fuente de datos Leer información de la base de datos Trabajar y manipular la información Eventualmente volcar información en la base de datos o modificar la información existente Cerrar la conexión con la base de datos A. Miñarro Bases de Datos con R Junio, 2013 11 / 23 Introducción RODBC Ejemplo Esquema general de trabajo Abrir conexión con una fuente de datos Leer información de la base de datos Trabajar y manipular la información Eventualmente volcar información en la base de datos o modificar la información existente Cerrar la conexión con la base de datos A. Miñarro Bases de Datos con R Junio, 2013 11 / 23 Introducción RODBC Ejemplo Esquema general de trabajo Abrir conexión con una fuente de datos Leer información de la base de datos Trabajar y manipular la información Eventualmente volcar información en la base de datos o modificar la información existente Cerrar la conexión con la base de datos A. Miñarro Bases de Datos con R Junio, 2013 11 / 23 Introducción RODBC Ejemplo Esquema general de trabajo Abrir conexión con una fuente de datos Leer información de la base de datos Trabajar y manipular la información Eventualmente volcar información en la base de datos o modificar la información existente Cerrar la conexión con la base de datos A. Miñarro Bases de Datos con R Junio, 2013 11 / 23 Introducción RODBC Ejemplo Esquema general de trabajo Abrir conexión con una fuente de datos Leer información de la base de datos Trabajar y manipular la información Eventualmente volcar información en la base de datos o modificar la información existente Cerrar la conexión con la base de datos A. Miñarro Bases de Datos con R Junio, 2013 11 / 23 Introducción RODBC Ejemplo Esquema del tema 1 Introducción 2 RODBC 3 Ejemplo A. Miñarro Bases de Datos con R Junio, 2013 12 / 23 Introducción RODBC Ejemplo Ejemplo Vamos a utilizar como ejemplo un par de bases de datos de Access. La base de datos inventario.mdb con dos tablas y la base de datos HDR2013.accdb también con dos tablas y esta última protegida con la contraseña ’1234’ A. Miñarro Bases de Datos con R Junio, 2013 13 / 23 Introducción RODBC Ejemplo Apertura de la comunicación > odbcDataSources() MS Access Database "Microsoft Access Driver (*.mdb, *.accdb)" Excel Files "Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)" dBASE Files "Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)" > myconn<-odbcConnectAccess('inventario.mdb') Podemos tener abiertas varias conexiones > myconn2<-odbcConnectAccess2007('HDR2013.accdb',pwd='1234') A. Miñarro Bases de Datos con R Junio, 2013 14 / 23 Introducción RODBC Ejemplo Apertura de la comunicación > odbcDataSources() MS Access Database "Microsoft Access Driver (*.mdb, *.accdb)" Excel Files "Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)" dBASE Files "Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)" > myconn<-odbcConnectAccess('inventario.mdb') Podemos tener abiertas varias conexiones > myconn2<-odbcConnectAccess2007('HDR2013.accdb',pwd='1234') A. Miñarro Bases de Datos con R Junio, 2013 14 / 23 Introducción RODBC Ejemplo Análisis de la información en la BD Podemos analizar las tablas presentes en la BD > Tablas1<-sqlTables(myconn,tableType='TABLE') > Tablas1$TABLE_NAME [1] "especies" "puntos" ası́ como los campos presentes en cada tabla > coltabla1<-sqlColumns(myconn,Tablas1$TABLE_NAME[1]) > coltabla1[,3:7] 1 2 3 4 5 TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE especies inventario 12 VARCHAR 50 especies genero 12 VARCHAR 50 especies especie 12 VARCHAR 50 especies punto 12 VARCHAR 50 especies mida 7 REAL 24 A. Miñarro Bases de Datos con R Junio, 2013 15 / 23 Introducción RODBC Ejemplo Análisis de la información en la BD Podemos analizar las tablas presentes en la BD > Tablas1<-sqlTables(myconn,tableType='TABLE') > Tablas1$TABLE_NAME [1] "especies" "puntos" ası́ como los campos presentes en cada tabla > coltabla1<-sqlColumns(myconn,Tablas1$TABLE_NAME[1]) > coltabla1[,3:7] 1 2 3 4 5 TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE especies inventario 12 VARCHAR 50 especies genero 12 VARCHAR 50 especies especie 12 VARCHAR 50 especies punto 12 VARCHAR 50 especies mida 7 REAL 24 A. Miñarro Bases de Datos con R Junio, 2013 15 / 23 Introducción RODBC Ejemplo Descarga de información > dfpuntos<-sqlFetch(myconn,'puntos') > dfespecies<-sqlFetch(myconn,'especies') A. Miñarro Bases de Datos con R Junio, 2013 16 / 23 Introducción RODBC Ejemplo Consultas > + > > + + > + + + + especies_a<-sqlQuery(myconn,"SELECT * FROM especies WHERE punto = 'a100'") generos<-sqlQuery(myconn,"SELECT DISTINCT genero FROM especies") combina<-sqlQuery(myconn,"SELECT genero, especie, salinidad FROM especies,puntos WHERE especies.punto = puntos.punto") promsal<-sqlQuery(myconn,"SELECT genero, AVG(salinidad) AS Promedio_Salinidad FROM puntos INNER JOIN especies ON especies.punto = puntos.punto GROUP BY genero") A. Miñarro Bases de Datos con R Junio, 2013 17 / 23 Introducción RODBC Ejemplo Volcado de la información > > > > sqlSave(myconn,promsal) tablas<-sqlTables(myconn,tableType='TABLE') sqlDrop(myconn,'promsal') tablas<-sqlTables(myconn,tableType='TABLE') A. Miñarro Bases de Datos con R Junio, 2013 18 / 23 Introducción RODBC Ejemplo Cerrando la conexión Cerrando la conexión > close(myconn) > close(myconn2) A. Miñarro Bases de Datos con R Junio, 2013 19 / 23 Introducción RODBC Ejemplo Ejemplo con SQLite > install.packages("DBI") > install.packages("RSQLite") > install.packages("nutshell") > library(RSQLite) > library(nutshell) > base<-"C:/Users/antonio/Documents/R/win-library/3.0/nutshell.bbdb/extdata/bb.db" > drv <- dbDriver("SQLite") > con <- dbConnect(drv,dbname=base) A. Miñarro Bases de Datos con R Junio, 2013 20 / 23 Introducción RODBC Ejemplo Ejemplo con SQLite (2) > dbListTables(con) [1] [4] [7] [10] [13] [16] [19] [22] [25] "Allstar" "AwardsManagers" "AwardsSharePlayers" "Fielding" "HOFold" "ManagersHalf" "PitchingPost" "SchoolsPlayers" "TeamsFranchises" "AllstarFull" "AwardsPlayers" "Batting" "FieldingOF" "HallOfFame" "Master" "Salaries" "SeriesPost" "TeamsHalf" "Appearances" "AwardsShareManagers" "BattingPost" "FieldingPost" "Managers" "Pitching" "Schools" "Teams" "xref_stats" > dbListFields(con,"Allstar") [1] "playerID" "yearID" A. Miñarro "lgID" Bases de Datos con R Junio, 2013 21 / 23 Introducción RODBC Ejemplo Ejemplo con SQLite (3) > batting.2008 <- dbGetQuery(con, + paste("SELECT m.nameLast, m.nameFirst, m.weight, m.height, ", + "m.bats, m.throws, m.debut, m.birthYear, b.* ", + "from Master m inner join Batting b ", + "on m.playerID=b.playerID where b.yearID=2008")) > names(batting.2008) [1] [7] [13] [19] [25] [31] "nameLast" "debut" "lgID" "2B" "BB" "GIDP" "nameFirst" "birthYear" "G" "3B" "SO" "G_old" "weight" "playerID" "G_batting" "HR" "IBB" "height" "yearID" "AB" "RBI" "HBP" "bats" "stint" "R" "SB" "SH" "throws" "teamID" "H" "CS" "SF" > dim(batting.2008) [1] 1384 32 A. Miñarro Bases de Datos con R Junio, 2013 22 / 23 Introducción RODBC Ejemplo Ejemplo con SQLite (4) > batters <- dbReadTable(con,"Batting") > dim(batters) [1] 91457 24 > dbDisconnect(con) [1] TRUE A. Miñarro Bases de Datos con R Junio, 2013 23 / 23