Czy współczesne biblioteki R i / lub Python powodują, że SQL staje się przestarzały?


14

Pracuję w biurze, w którym SQL Server jest podstawą wszystkiego, co robimy, od przetwarzania danych przez czyszczenie po mung. Mój kolega specjalizuje się w pisaniu złożonych funkcji i procedur przechowywanych w celu metodycznego przetwarzania przychodzących danych, aby można je było znormalizować i uruchomić w raportach, wizualizacjach i projektach analitycznych. Przed rozpoczęciem tutaj miałem bardzo małe doświadczenie z SQL, oprócz pisania najbardziej podstawowych zapytań. Ogromna większość moich prac przygotowawczych do analizy została wykonana w R. Mój szef nalega, że ​​poprawiam swoje umiejętności posługiwania się językiem SQL, chociaż wydaje się, że istnieje bardzo niewiele zadań, których nie można wykonać wydajniej i przy znacznie mniejszej liczbie wierszy kodu przy użyciu języka R pakiety takie jak dplyr, data.table i tidyr (żeby wymienić tylko kilka). Moje pytanie brzmi - czy to ma sens?

Kilka tygodni temu stanąłem przed zadaniem uzyskania listy nazw kolumn dla każdego wiersza w tabeli, która spełniała określone kryteria, i połączenia ich w wektor ciągów. Termin był napięty, w tym czasie miałem pewną blokadę i nie mogłem całkiem otoczyć problemu. Poprosiłem mojego szefa, który z kolei poprosił mojego kolegę o napisanie skryptu TSQL w celu rozwiązania problemu. Podczas gdy on nad tym pracował, wymyśliłem sposób na zrobienie tego w R, pisząc dość prostą funkcję i stosując ją do ramki danych. Mój kolega wrócił ze scenariuszem około dwie godziny później. Było to co najmniej 75 linii, w tym dwie zagnieżdżone dla pętli. Poprosiłem go, aby powiadomił o zakończeniu pracy, a on powiedział, że zajmie to kilka godzin. Tymczasem mój skrypt R był w stanie zapętlić ~ 45 000 rekordów w około 30 sekund.

Czy mam prawo założyć, że R jest znacznie lepszym wyborem do czyszczenia i mungowania danych? Może programista SQL w moim biurze jest po prostu nieudolny? Jestem ciekawy, czy ktokolwiek, kto pracował zarówno z R, jak i SQL (lub Python i SQL, jeśli o to chodzi) ma jakieś przemyślenia na ten temat.


2
Jeśli baza danych jest wystarczająco mała i statyczna, możesz załadować ją do pamięci i użyć preferowanego narzędzia ETL, takiego jak dplyr. Twoje podejście po prostu nie zadziała, jeśli masz duże dane w chmurze. Regularnie uruchamiam zapytania, które powodują, że BigQuery (Google) narzeka. Piszę zapytania bezpośrednio w SQL, ale mógłbym użyć Spark jako warstwy pośredniej do działania w ramkach danych, jeśli chciałbym.
Emre

1
Czy SQL jest z natury bardziej wydajny niż R pod względem sposobu przechowywania danych, czy tylko serwery SQL mają zwykle większą wbudowaną pamięć i moc przetwarzania?
AffableAmbler

1
Nie można złożyć instrukcji zbiorczej - zależy to od implementacji - ale dobre bazy danych mają optymalizatory zapytań, a niektóre z nich (np. BigQuery) obsługują wykonywanie wielordzeniowe. Być może chcesz, aby baza danych lub abstrakcja ORM znajdowały się nad bazą danych, aby uniknąć SQL. Wygląda na to, że dplyr już to robi (por. Tłumaczenie SQL ). Możesz sprawdzić to samo zapytanie w dplyr względem surowego SQL, aby się dowiedzieć. To, co niektórzy robią, to pobranie małej próbki danych do prototypowania, a następnie wykorzystanie narzędzi do dużych zbiorów danych do produkcji
Emre,

3
Możesz po prostu uruchomić R w SQL Server i mieć to, co najlepsze z obu światów
Gaius

Odpowiedzi:


13

R i SQL to dwie zupełnie różne bestie. SQL to język, którego można używać do przeszukiwania danych przechowywanych w bazach danych, tak jak już to robiłeś. Zalety SQL w porównaniu do R polega głównie na fakcie serwera bazy danych (MS SQL, Oracle, PostgreSQL, MySQL itp.).

Większość, jeśli nie wszystkie, nowoczesne serwery baz danych pozwalają wielu użytkownikom wyszukiwać dane z tego samego źródła danych oraz wstawiać, aktualizować i usuwać dane w tych samych tabelach, zapewniając jednocześnie spójność danych. Jest to niezbędne do powiedzenia rejestrowania transakcji bankowej. Czy możesz sobie wyobrazić prowadzenie banku na R? Właśnie tam wchodzą serwery baz danych. Zapewniają one właściwości ACID procedur uruchamianych w bazie danych. ACID oznacza Atomowość, współbieżność, izolację i trwałość (patrz opis ACID na wikipedii ). R to platforma dla jednego użytkownika, w której wszystko dzieje się w pamięci. Jeśli więc komputer przestanie działać w połowie dużej operacji, dane nie zostaną zapisane. Jesteś także jedyną osobą, która może uzyskać dostęp do danych. Dla jasności R nie jest uważane za alternatywę dla serwerów baz danych i / lub SQL.

Inną główną zaletą serwerów baz danych jest to, że dobry projekt bazy danych zapewni szybkie zapytania do bazy danych poprzez optymalizację zapytań. Aby osiągnąć tę bazę danych, serwery śledzą projekt tabeli. Zobacz pełną dyskusję na ten temat na stronie wiki . R nie może przeprowadzić optymalizacji zapytania. Zły projekt bazy danych może prowadzić do powolnego wykonywania zapytań. Serwery baz danych mogą również przeprowadzać optymalizację zapytań, które wyszukują zapytania w wielu tabelach, jeśli klucze obce są właściwie używane w projekcie bazy danych.

Język SQL ma bardzo inną składnię i podzielam się z Wami doświadczeniem, że krótsze jest pisanie kroków mungowania danych przy użyciu tabeli danych lub składni dplyr. Czasami jednak twoje dane są zbyt duże dla R lub musisz przechowywać wyniki w bazie danych jako część okresowego zadania wsadowego, które będzie wymagać kodowania logiki w SQL.

Z mojego doświadczenia wynika, że ​​istnieją szczególne przypadki użycia SQL i R / Python. SQL doskonale nadaje się do przechowywania danych o znaczeniu krytycznym dla biznesu oraz do umożliwienia wielu osobom dostępu, modyfikacji, wstawiania i usuwania danych w scentralizowanym środowisku. Dla wszelkich jednorazowych danych munging R i Python są świetne. Jeśli munging danych musi być okresowo wykonywany, konieczne będzie przeniesienie skryptu R / Python na SQL.


3

Tak naprawdę nie są nawet porównywalne. SQL to język przeznaczony do uzyskiwania dostępu do danych, R to język przeznaczony do pracy z danymi.

SQL nie jest skutecznym narzędziem do mungowania, ponieważ trudno jest zobaczyć kroki pośrednie, a kiedy generuje błędy, prawdopodobnie nie odnosi się do formy / jakości / struktury danych.

Mój przepływ pracy to zazwyczaj:

  1. Uzyskaj surowe dane z zapytania SQL (w R)
  2. Zbuduj rutynę munging
  3. Jeśli to możliwe, ponownie napisz zapytanie SQL, aby wykonać munging, którego dokonałem w R.

Należy również zdawać sobie sprawę, że nie wszyscy konsumenci danych używają języka R, ale wielu nadal łączy wybraną przez siebie platformę z danymi za pomocą SQL.


1
Jest to ten sam proces, który podążam (ku niechęci mojego przełożonego). Zgadzam się, że wykonywanie skomplikowanych zadań mungowania, takich jak to, które opisałem powyżej, wydaje się być o wiele bardziej wydajne w języku takim jak R. (Doceń to potwierdzenie). Ale jeśli jedynym celem SQL jest gigantyczny dysk twardy dla twoich danych, dlaczego po prostu nie masz serwera R. Wygląda na to, że wszystkie funkcje (mapowanie, konfigurowanie kluczy do łączenia tabel, grupowanie i łączenie danych) można teraz wykonywać bardzo skutecznie w języku R. Czy tabela SQL jest bardziej wydajna pod względem wykorzystania pamięci niż ramka danych R?
AffableAmbler

1
@ Nie, ponieważ nie wszyscy ludzie używają R.
HEITZ

2

biblioteka (dbplyr) ma właściwe podejście: zapisz wszystko w R (używając tidyverse) i pozwól bibliotece w odpowiednim momencie „skompilować” kod R do niskiego poziomu SQL.

Ponieważ nie wszystkie mungowanie można przetłumaczyć, innym podejściem jest SQL Server: pozwól, aby fragmenty kodu R były wywoływane z komend SQL „select”.


1

Podejście 1., 2., 3. wspomniane przez HEITZ jest z mojego doświadczenia możliwe, aby rozszerzyć je o alternatywę dla 3., w której zapisujesz dane z R (data.table) z powrotem do MySQL.

Tak więc pełne kroki to MySQL-> data.table-> MySQL

Jeśli upewnisz się, że używasz składni data.table, w której nie kopiujesz ID, jest on również przyjazny dla pamięci RAM.


1

Jednym słowem NIE . SQL jest potężnym zwięzłym i elastycznym sposobem opisywania i podsumowywania strukturowanych częściowo ustrukturyzowanych, a nawet nieustrukturyzowanych danych - gdy na nim umieszczona jest odpowiednia warstwa interpretera. Nawiasem mówiąc, sqljest uważany za prawie niezbędny dla naukowców zajmujących się danymi.

SQL to zwięzły i skuteczny sposób wykonywania podstawowych operacji:

  • projekcje ( wybierz ..)
  • filtrowanie ( gdzie ..)
  • grupowanie / filtrowanie ( grupowanie według i posiadanie )
  • podstawowe agregacje ( liczba , suma , śr .)
  • łączy się

Prawdziwa moc pojawia się podczas łączenia wyników za pomocą wbudowanych widoków . Kiedy muszę zrobić, że będę używać jednego sqldf, pandasql, pysparkSql/ sparkSqllub bezpośrednie połączenie RDBMS. Pisanie tego samego w najbardziej zwięzły sposób z data.table(znacznie lepszym niż data.frame) lub datatable(lepszym niż pandas) jest jeszcze bardziej niezgrabne, znacznie bardziej niezgrabne lub prawie niemożliwe, w zależności od złożoności podejmowanych zapytań.

W przypadku mungowania danych : to inna historia: niektóre operacje można łatwo wyrazić w sql, a niektóre nie za bardzo. Gdy jednak włączasz UDFs, istnieje szersza swoboda tego, co można osiągnąć. Moje bieżące zadanie obejmuje szereg UDFczynności takich jak operacje przecinania klientów , niestandardowe agregacje i niestandardowe metody oceniania .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.