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.
Odpowiedzi:
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.
źródło
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:
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.
źródło
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”.
źródło
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.
źródło
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,
sql
jest 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: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
/sparkSql
lub bezpośrednie połączenie RDBMS. Pisanie tego samego w najbardziej zwięzły sposób zdata.table
(znacznie lepszym niżdata.frame
) lubdatatable
(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
UDF
s, istnieje szersza swoboda tego, co można osiągnąć. Moje bieżące zadanie obejmuje szeregUDF
czynności takich jak operacje przecinania klientów , niestandardowe agregacje i niestandardowe metody oceniania .źródło