As modernas bibliotecas R e / ou Python tornam o SQL obsoleto?

14

Eu trabalho em um escritório onde o SQL Server é a espinha dorsal de tudo o que fazemos, desde o processamento de dados até a limpeza e a substituição. Meu colega é especialista em escrever funções complexas e procedimentos armazenados para processar metodicamente os dados recebidos, para que possam ser padronizados e colocados em funcionamento em projetos de relatórios, visualizações e análises. Antes de começar aqui, eu tinha muito pouca experiência com SQL, além de escrever as consultas mais básicas. A grande maioria do meu trabalho de preparação para análises foi feita em R. Meu chefe insiste em que eu melhore minhas habilidades em SQL, embora pareça haver muito poucas atribuições que não possam ser feitas com mais eficiência e com muito menos linhas de código usando R pacotes como dplyr, data.table e tidyr (para citar alguns). Minha pergunta é - isso faz sentido?

Há algumas semanas, me deparei com a tarefa de obter uma lista de nomes de colunas para cada linha em uma tabela que atendesse a certos critérios e concatená-los em um vetor de strings. Havia um prazo apertado e, na época, eu estava enfrentando algum bloqueio e não conseguia entender o problema. Perguntei ao meu chefe, que por sua vez pediu ao meu colega para escrever um script TSQL para resolver o problema. Enquanto ele estava trabalhando nisso, descobri uma maneira de fazê-lo no R escrevendo uma função bastante simples e aplicando-a sobre o quadro de dados. Meu colega voltou com o roteiro cerca de duas horas depois. Havia pelo menos 75 linhas, incluindo duas aninhadas para loops. Pedi-lhe para avisar quando terminasse de correr e ele disse que levaria várias horas. Enquanto isso, meu script R foi capaz de repetir os ~ 45.000 registros em cerca de 30 segundos.

Estou certo ao supor que R é uma escolha muito melhor para limpar e filtrar dados? Talvez o desenvolvedor SQL no meu escritório seja apenas inepto? Estou curioso para saber se alguém que trabalhou com R e SQL (ou Python e SQL) tem alguma idéia sobre isso.

AffableAmbler
fonte
2
Se o seu banco de dados for pequeno o suficiente e estático, você poderá carregá-lo na memória e usar sua ferramenta ETL preferida, como o dplyr. Sua abordagem simplesmente não funcionará quando você tiver grandes dados na nuvem. Eu costumo executar consultas que fazem o BigQuery (Google) reclamar. Eu escrevo consultas diretamente no SQL, mas poderia usar o Spark como uma camada intermediária para operar em quadros de dados, se quisesse.
Emre
1
Então, o SQL é inerentemente mais eficiente que o R em termos de como os dados são armazenados ou apenas os servidores SQL tendem a ter mais memória interna e poder de processamento?
AffableAmbler
1
Você não pode fazer uma declaração geral - depende da implementação - mas bons bancos de dados têm otimizadores de consulta, e alguns deles (como o BigQuery) oferecem suporte à execução multicore. Talvez o que você queira seja uma abstração de dataframe ou ORM na parte superior do banco de dados para evitar o SQL. Parece que o dplyr já faz isso até certo ponto (cf. tradução SQL ). Você pode comparar a mesma consulta no dplyr com o SQL bruto para descobrir. O que alguns fazer é tomar uma pequena amostra de dados para prototipagem, em seguida, sacar as grandes ferramentas de dados para a produção
Emre
3
Você pode simplesmente executar R dentro SQL Server e ter o melhor dos dois mundos
Gaius

Respostas:

13

R e SQL são dois animais completamente diferentes. SQL é uma linguagem que você pode usar para consultar dados armazenados em bancos de dados como você já experimentou. Os benefícios do SQL versus R estão principalmente no fato do servidor de banco de dados (MS SQL, Oracle, PostgreSQL, MySQL, etc.).

A maioria dos servidores de banco de dados modernos, se não todos, permite que vários usuários consultem dados da mesma fonte de dados e insiram, atualizem e excluam dados nas mesmas tabelas, garantindo ao mesmo tempo que os dados permaneçam consistentes. Isso é essencial para, por exemplo, gravar uma transação bancária. Você pode imaginar administrar um banco no R? É aí que entram os servidores de banco de dados. Eles garantem que as propriedades ACID dos procedimentos sejam executadas no banco de dados. ACID significa Atomicidade, simultaneidade, isolamento e durabilidade (consulte a descrição do ACID na wikipedia ). R é uma plataforma de usuário único onde tudo acontece na memória. Portanto, se o seu computador parar de funcionar na metade de uma grande operação, seus dados não serão armazenados. Você também é a única pessoa que pode acessar os dados. Para esclarecer, R não é considerado uma alternativa para servidores de banco de dados e / ou SQL.

Outra vantagem principal dos servidores de banco de dados é que um bom design de banco de dados garantirá que você possa consultar seu banco de dados rapidamente, executando a otimização de consulta. Para atingir esse banco de dados, os servidores acompanhem o design de uma tabela. Veja para uma discussão completa deste tópico a página wiki . R não pode executar otimização de consulta. Design de banco de dados ruim, pode levar à execução lenta de suas consultas. Os servidores de banco de dados também podem executar otimizações em consultas que consultam várias tabelas se chaves estrangeiras forem usadas corretamente no design do banco de dados.

A linguagem SQL tem uma sintaxe muito diferente e eu compartilho sua experiência de que é mais curto escrever etapas de transferência de dados usando a tabela de dados ou a sintaxe dplyr. No entanto, às vezes seus dados são grandes demais para R ou você precisa armazenar os resultados no banco de dados como parte de um trabalho em lotes periódico, o que exigirá codificar sua lógica no SQL.

Na minha experiência, existem casos de uso específicos para SQL e R / Python. O SQL é ótimo para armazenar dados críticos de negócios e permitir que várias pessoas acessem, modifiquem, insiram e excluam dados em um ambiente centralizado. Para qualquer dado único, R e Python são ótimos. Se a transferência de dados precisar ser executada periodicamente, você precisará portar seu script R / Python para SQL.

Estéreo
fonte
3

Estes nem sequer são comparáveis, realmente. SQL é uma linguagem destinada a acessar dados, R é uma linguagem destinada a trabalhar com dados.

O SQL não é uma ferramenta eficaz para munging, porque é difícil ver etapas intermediárias e, quando gera erros, não é provável que ele endereça a forma / qualidade / estrutura dos seus dados.

Meu fluxo de trabalho normalmente é:

  1. Obter dados brutos da consulta SQL (em R)
  2. Criar rotina de munging
  3. Se possível, reescreva a consulta SQL para realizar o munging realizado em R

Perceba também que nem todos os consumidores de dados usam R, mas muitos ainda fazem interface de sua plataforma preferida com dados usando SQL.

HEITZ
fonte
1
Este é o mesmo processo que eu sigo (para desgosto do meu supervisor). Concordo que executar tarefas complexas como a que descrevi acima parece ser muito mais eficiente em uma linguagem como R. (Aprecie a afirmação). Mas se o único objetivo do SQL é ser um disco rígido gigante para seus dados, por que não apenas ter um servidor R? Parece que todas as funções (mapeamento, configuração de chaves para vincular tabelas, agrupamento e associação de dados) agora podem ser executadas com muita eficácia no R. Uma tabela SQL é mais eficiente em termos de uso de memória do que um quadro de dados R?
AffableAmbler
1
@Noah porque nem todas as pessoas usam R.
HEITZ
2

A biblioteca (dbplyr) possui a abordagem correta: escreva tudo em R (usando o tidyverse) e deixe a biblioteca na hora certa "compilar" o código R para SQL de baixo nível.

Como nem todo munging é traduzível, outra abordagem é a adotada pelo SQL Server: permita que trechos de código R sejam invocados a partir dos comandos "select" do SQL.

Dan Reznik
fonte
1

A abordagem 1., 2., 3. mencionada pela HEITZ é, na minha experiência, possível estendendo-se com uma alternativa para 3. onde você escreve seus dados de R (data.table) de volta ao MySQL.

Então, etapas completas são MySQL-> data.table-> MySQL

Se você garantir o uso da sintaxe data.table em que não copia o DT, também é compatível com RAM.

Niels Krogh
fonte
1

Numa palavra NÃO . O SQL é uma maneira concisa e flexível poderosa de descrever e resumir dados estruturados, semiestruturados e até não estruturados - quando uma camada de intérprete apropriada é colocada sobre ela. A propósito, sqlé considerado quase obrigatório para os cientistas de dados.

SQL é uma maneira concisa e poderosa de executar suas operações principais de:

  • projeções ( selecione ..)
  • filtragem ( onde ..)
  • agrupamento / filtragem ( agrupar por e ter )
  • agregações básicas ( contagem , soma , média ..)
  • junta-se

O poder real vem ao combinar resultados usando visualizações embutidas . Quando eu preciso fazer isso vou usar um dos sqldf, pandasql, pysparkSql/ sparkSqlou uma conexão RDBMS direta. Escrever o mesmo da maneira mais concisa possível com data.table(muito melhor que data.frame) ou datatable(melhor que pandas) ainda é mais desajeitado, muito mais desajeitado ou quase impossível, dependendo da complexidade das consultas tentadas.

Para munging de dados : essa é uma história diferente: algumas operações são facilmente expressas em sql e outras nem tanto. Quando, no entanto, você incorpora UDFs, existe uma latitude mais ampla do que pode ser alcançado. Minha tarefa atual inclui vários UDFs para executar operações de interseção de clientes , agregações personalizadas e métodos de pontuação personalizados .

javadba
fonte