Twórz grafy i wykresy za pomocą SQL i R (przewodnik)

Dotyczy: SQL Server 2016 (13.x) i nowsze wersje

W tej części przejścia poznajesz techniki generowania wykresów i map z użyciem R z danymi SQL Server. Tworzysz prosty histogram, a następnie rozwijasz bardziej złożony wykres mapy.

Wymagania wstępne

W tym kroku założono, że trwa sesja języka R oparta na poprzednich krokach w tym przewodniku. Używa on parametrów połączenia i obiektów źródła danych utworzonych w tych krokach. Następujące narzędzia i pakiety są używane do uruchamiania skryptu.

  • Rgui.exe do uruchamiania poleceń języka R
  • Narzędzie Management Studio do uruchamiania poleceń T-SQL
  • googMap
  • Pakiet GGMAP
  • Pakiet mapproj

Tworzenie histogramu

  1. Wygeneruj pierwszy wykres, używając funkcji rxHistogram . Funkcja rxHistogram oferuje funkcje podobne do tych w otwartych pakietach R, ale może działać w kontekście zdalnego wykonywania.

    # Plot fare amount on SQL Server and return the plot
    start.time <- proc.time()
    rxHistogram(~fare_amount, data = inDataSource, title = "Fare Amount Histogram")
    used.time <- proc.time() - start.time
    print(paste("It takes CPU Time=", round(used.time[1]+used.time[2],2), " seconds, Elapsed Time=", round(used.time[3],2), " seconds to generate plot.", sep=""))
    
  2. Obraz jest zwracany w urządzeniu graficznym R dla twojego środowiska programistycznego. Na przykład w RStudio kliknij okno Plot . W R Tools for Visual Studio otwiera się osobne okno graficzne.

    Wykorzystanie rxHistogram do tworzenia histogramu kwot opłat

    Note

    Czy Twój wykres wygląda inaczej?

    To dlatego, że inDataSource używa tylko górnych 1000 wierszy. Kolejność wierszy z użyciem TOP jest niedeterministyczna w przypadku braku klauzuli ORDER BY, więc oczekuje się, że dane i powstały graf mogą się różnić. Ten konkretny obraz został wygenerowany na podstawie około 10 000 wierszy danych. Zalecamy, aby poeksperymentować z różnymi liczbami wierszy, aby otrzymać różne wykresy, oraz zanotować, ile czasu zajmuje uzyskanie wyników w twoim środowisku.

Stwórz wykres mapy

Zazwyczaj serwery baz danych blokują dostęp do Internetu. Może to być niewygodne przy korzystaniu z pakietów R, które muszą pobierać mapy lub inne obrazy do generowania wykresów. Jednak istnieje obejście, które może okazać się przydatne przy tworzeniu własnych aplikacji. W zasadzie generujesz reprezentację mapy na kliencie, a następnie nakładasz na nią punkty zapisane jako atrybuty w tabeli SQL Server.

  1. Zdefiniuj funkcję tworzącą obiekt wykresu R. Niestandardowa funkcja mapPlot tworzy wykres rozrzutowy, który wykorzystuje miejsca odbioru taksówek i pokazuje liczbę przejazdów rozpoczynających się z każdej lokalizacji. Korzysta z pakietów ggplot2 i ggmap , które powinny być już zainstalowane i załadowane.

    mapPlot <- function(inDataSource, googMap){
        library(ggmap)
        library(mapproj)
        ds <- rxImport(inDataSource)
        p <- ggmap(googMap)+
        geom_point(aes(x = pickup_longitude, y =pickup_latitude ), data=ds, alpha =.5,
    color="darkred", size = 1.5)
        return(list(myplot=p))
    }
    
    • Funkcja mapPlot przyjmuje dwa argumenty: istniejący obiekt danych, który wcześniej zdefiniowałeś za pomocą RxSqlServerData, oraz reprezentację map przekazaną przez klienta.
    • W linii zaczynającej się od zmiennej ds , rxImport służy do ładowania danych do pamięci z wcześniej utworzonego źródła danych, inDataSource. (To źródło danych zawiera tylko 1000 wierszy; jeśli chcesz stworzyć mapę z większą liczbą punktów danych, możesz zastąpić inne źródło danych.)
    • Za każdym razem, gdy używasz otwartych funkcji R, dane muszą być ładowane do ramek danych w pamięci lokalnej. Jednak wywołując funkcję rxImport , możesz działać w pamięci zdalnego kontekstu obliczeniowego.
  2. Zmień kontekst obliczeniowy na lokalny i załaduj biblioteki potrzebne do tworzenia map.

    rxSetComputeContext("local")
    library(ggmap)
    library(mapproj)
    gc <- geocode("Times Square", source = "google")
    googMap <- get_googlemap(center = as.numeric(gc), zoom = 12, maptype = 'roadmap', color = 'color');
    
    • Zmienna ta gc przechowuje zestaw współrzędnych dla Times Square, NY.

    • Linia zaczynająca się od googmap generuje odwzorowanie o określonych współrzędnych w centrum.

  3. Przełącz się na kontekst obliczeniowy SQL Server i renderuj wyniki, opakowując funkcję wykresu w rxExec, jak pokazano tutaj. Funkcja rxExec jest częścią pakietu RevoScaleR i obsługuje wykonywanie dowolnych funkcji R w kontekście zdalnych obliczeń.

    rxSetComputeContext(sqlcc)
    myplots <- rxExec(mapPlot, inDataSource, googMap, timesToRun = 1)
    plot(myplots[[1]][["myplot"]]);
    
    • Dane mapy w googMap są przekazywane jako argument do funkcji wykonywanej zdalnie mapPlot. Ponieważ mapy zostały wygenerowane w twoim lokalnym środowisku, muszą zostać przekazane do funkcji, aby stworzyć wykres w kontekście SQL Server.

    • Gdy wykonywana jest linia zaczynająca się od plot, renderowane dane są ponownie serializowane do lokalnego środowiska R, aby można było je wyświetlić w kliencie R.

    Note

    Jeśli używasz SQL Server w maszynie wirtualnej Azure, możesz wtedy uzyskać błąd. Błąd występuje, gdy domyślna reguła zapory w Azure blokuje dostęp do sieci za pomocą kodu R. Szczegóły dotyczące naprawy tego błędu można znaleźć w artykule Installing Machine Learning (R) Services on an Azure VM.

  4. Poniższy obraz przedstawia wykres wyjściowy. Miejsca odbioru taksówek są dodawane na mapę jako czerwone kropki. Twój obraz może wyglądać inaczej, w zależności od liczby lokalizacji w źródle danych, którego używasz.

    rysowanie wykresu przejazdów taksówką za pomocą niestandardowej funkcji R

Następny krok