¿Las bibliotecas modernas de R y / o Python hacen que SQL sea obsoleto?

14

Trabajo en una oficina donde SQL Server es la columna vertebral de todo lo que hacemos, desde el procesamiento de datos hasta la limpieza y el mung. Mi colega se especializa en escribir funciones complejas y procedimientos almacenados para procesar metódicamente los datos entrantes para que puedan estandarizarse y ponerse a trabajar en informes, visualizaciones y proyectos analíticos. Antes de comenzar aquí, tenía muy poca experiencia con SQL, aparte de escribir las consultas más básicas. La gran mayoría de mi trabajo de preparación de análisis se realizó en R. Mi jefe insiste en que mejore mis habilidades de SQL, aunque parece que hay muy pocas tareas que no se pueden hacer de manera más eficiente y con muchas menos líneas de código usando R paquetes como dplyr, data.table y tidyr (por nombrar algunos). Mi pregunta es: ¿tiene sentido?

Hace un par de semanas, me encontré con la tarea de obtener una lista de nombres de columna para cada fila en una tabla que cumpliera con ciertos criterios y concatenarlos en un vector de cadenas. Había una fecha límite ajustada y, en ese momento, estaba experimentando un bloqueo y no podía entender el problema. Le pregunté a mi jefe, quien a su vez le pidió a mi colega que escribiera un script TSQL para resolver el problema. Mientras trabajaba en ello, descubrí una forma de hacerlo en R escribiendo una función bastante simple y aplicándola sobre el marco de datos. Mi colega volvió con su guión unas dos horas después. Era al menos 75 líneas que comprenden dos bucles anidados. Le pedí que avisara cuando terminara la ejecución y dijo que tomaría varias horas. Mientras tanto, mi script R pudo recorrer los ~ 45,000 registros en aproximadamente 30 segundos.

¿Tengo razón al suponer que R es una opción mucho mejor para limpiar y mezclar datos? ¿Quizás el desarrollador de SQL en mi oficina es simplemente inepto? Tengo curiosidad por saber si alguien que haya trabajado con R y SQL (o Python y SQL) tiene alguna idea al respecto.

AfableAmbler
fuente
2
Si su base de datos es lo suficientemente pequeña y estática, puede cargarla en la memoria y usar su herramienta ETL preferida, como dplyr. Su enfoque simplemente no funcionará cuando tenga grandes datos en la nube. Regularmente ejecuto consultas que hacen que BigQuery (Google) se queje. Escribo consultas directamente en SQL, pero podría usar Spark como capa intermedia para operar en marcos de datos si quisiera.
Emre
1
Entonces, ¿es SQL inherentemente más eficiente que R en términos de la forma en que se almacenan los datos, o es solo que los servidores SQL tienden a tener más memoria incorporada y potencia de procesamiento?
AffableAmbler
1
No puede hacer una declaración general, depende de la implementación, pero las buenas bases de datos tienen optimizadores de consultas, y algunas de ellas (como BigQuery) admiten la ejecución multinúcleo. Tal vez lo que desea es un marco de datos o una abstracción ORM en la parte superior de su base de datos para evitar SQL. Parece que dplyr ya lo hace hasta cierto punto (cf. traducción de SQL ). Puede averiguar la misma consulta en dplyr contra SQL sin procesar para averiguarlo. Lo que algunos hacen es tomar una pequeña muestra de datos para la creación de prototipos, y luego sacar las herramientas de Big Data para la producción
Emre
3
Simplemente puede ejecutar R dentro de SQL Server y tener lo mejor de ambos mundos
Gaius

Respuestas:

13

R y SQL son dos bestias completamente diferentes. SQL es un lenguaje que puede usar para consultar datos almacenados en bases de datos como ya lo ha experimentado. Los beneficios de SQL versus R residen principalmente en el hecho del servidor de la base de datos (MS SQL, Oracle, PostgreSQL, MySQL, etc.).

La mayoría, si no todos, los servidores de bases de datos modernos permiten que múltiples usuarios consulten datos del mismo origen de datos e inserten, actualicen y eliminen datos en las mismas tablas a la vez que aseguran que los datos permanecen consistentes. Esto es esencial para, por ejemplo, registrar una transacción bancaria. ¿Te imaginas tener un banco en R? Ahí es donde entran los servidores de bases de datos. Aseguran que las propiedades ACID de los procedimientos se ejecuten en la base de datos. ACID significa Atomicidad, concurrencia, aislamiento y durabilidad (consulte la descripción de ACID en wikipedia ). R es una plataforma de usuario único donde todo sucede en la memoria. Por lo tanto, si su computadora deja de funcionar a la mitad en una operación grande, sus datos no se almacenarán. También es la única persona que puede acceder a los datos. Para ser claros, R no se considera una alternativa para los servidores de bases de datos y / o SQL.

Otra ventaja principal de los servidores de bases de datos es que un buen diseño de la base de datos garantizará que pueda consultar su base de datos rápidamente mediante la optimización de la consulta. Para lograr esta base de datos, los servidores realizan un seguimiento del diseño de una tabla. Vea para una discusión completa de este tema la página wiki . R no puede realizar la optimización de consultas. El diseño deficiente de la base de datos puede llevar a una ejecución lenta de sus consultas. Los servidores de bases de datos también pueden realizar la optimización de las consultas que consultan varias tablas si las claves externas se utilizan correctamente en el diseño de la base de datos.

El lenguaje SQL tiene una sintaxis muy diferente y comparto su experiencia de que es más corto escribir pasos de mezcla de datos utilizando la tabla de datos o la sintaxis dplyr. Sin embargo, a veces sus datos son demasiado grandes para R o necesita almacenar los resultados en la base de datos como parte de un trabajo por lotes periódico, que requerirá codificar su lógica en SQL.

En mi experiencia, hay casos de uso particulares para SQL y R / Python. SQL es ideal para almacenar datos críticos del negocio y para permitir que varias personas accedan, modifiquen, inserten y eliminen datos en un entorno centralizado. Para cualquier tipo de datos únicos, R y Python son geniales. Si su mezcla de datos necesita ejecutarse periódicamente, deberá portar su script R / Python a SQL.

Estéreo
fuente
3

Estos ni siquiera son comparables, en realidad. SQL es un lenguaje destinado a acceder a datos, R es un lenguaje destinado a trabajar con datos.

El SQL no es una herramienta efectiva para el munging porque es difícil ver pasos intermedios y cuando arroja errores, no es probable que aborde la forma / calidad / estructura de sus datos.

Mi flujo de trabajo es típicamente:

  1. Obtenga datos sin procesar de la consulta SQL (en R)
  2. Construir rutina munging
  3. Si es posible, vuelva a escribir la consulta SQL para lograr munging que logré en R

También tenga en cuenta que no todos los consumidores de datos usan R, pero muchos aún interactúan su plataforma de elección con datos que usan SQL.

HEITZ
fuente
1
Este es el mismo proceso que sigo (para disgusto de mi supervisor). Estoy de acuerdo en que realizar tareas complejas de munging como la que describo anteriormente parece ser mucho más eficiente en un lenguaje como R. (Aprecio la afirmación). Pero si el único propósito de SQL es ser un disco duro gigante para sus datos, ¿por qué no solo tener un servidor R? Parece que todas las funciones (mapeo, configuración de teclas para vincular tablas, agrupar y unir datos) ahora se pueden hacer de manera muy efectiva en R. ¿Es una tabla SQL más eficiente en términos de uso de memoria que un marco de datos R?
AffableAmbler
1
@Noah porque no todas las personas usan R.
HEITZ
2

library (dbplyr) tiene el enfoque correcto: escriba todo en R (usando el tidyverse) y deje que la biblioteca "compile" justo a tiempo el código R en SQL de bajo nivel.

Dado que no todo el munging es traducible, otro enfoque es el adoptado por SQL Server: permita que los fragmentos de código R se invoquen desde los comandos "select" de SQL.

Dan Reznik
fuente
1

El enfoque 1., 2., 3. mencionado por HEITZ es, en mi experiencia, posible ampliar con una alternativa para 3. donde usted escribe sus datos de R (data.table) nuevamente en MySQL.

Entonces, los pasos completos son MySQL-> data.table-> MySQL

Si se asegura de usar la sintaxis data.table donde no copia el DT, también es compatible con RAM.

Niels Krogh
fuente
1

En una palabra NO . SQL es una forma poderosa, concisa y flexible de describir y resumir datos estructurados, semiestructurados e incluso no estructurados, cuando se coloca una capa de intérprete adecuada encima. Por cierto, sqlse considera casi imprescindible para los científicos de datos.

SQL es una forma concisa y poderosa de realizar sus operaciones principales de:

  • proyecciones ( seleccionar ..)
  • filtrado ( donde ..)
  • agrupación / filtrado ( agrupar por y tener )
  • agregaciones básicas ( conteo , suma , promedio ..)
  • Uniones

El poder real viene cuando se combinan resultados usando vistas en línea . Cuando tengo que hacer que voy a utilizar uno de sqldf, pandasql, pysparkSql/ sparkSqluna conexión directa o RDBMS. Escribir lo mismo de la manera más concisa posible con data.table(mucho mejor que data.frame) o datatable(mejor que pandas) es aún más torpe, mucho más torpe o casi imposible dependiendo de la complejidad de las consultas intentadas.

Para la mezcla de datos : esa es una historia diferente: algunas operaciones se expresan fácilmente en SQL y otras no tanto. Sin embargo, cuando incorporas UDFs hay una latitud más amplia de lo que se puede lograr. Mi tarea actual incluye varios correos UDFelectrónicos para hacer cosas tales como operaciones de intersección de clientes , agregaciones personalizadas y métodos de puntuación personalizados .

javadba
fuente