Spark SQL er et Spark-modul til behandling af strukturerede data. I modsætning til den grundlæggende Spark RDD API giver de grænseflader, der leveres af Spark SQL, Spark flere oplysninger om strukturen af både dataene og den beregning, der udføres. Internt bruger Spark SQL disse ekstra oplysninger til at udføre ekstra optimeringer. Der er flere måder at interagere med Spark SQL på, herunder SQL og Dataset API’en. Ved beregning af et resultat anvendes den samme eksekveringsmotor, uafhængigt af hvilket API/sprog du bruger til at udtrykke beregningen. Denne ensretning betyder, at udviklere nemt kan skifte frem og tilbage mellem forskellige API’er baseret på, hvilken der giver den mest naturlige måde at udtrykke en given transformation på.
Alle eksempler på denne side bruger eksempeldata, der er inkluderet i Spark-distributionen, og kan køres i spark-shell
, pyspark
shell eller sparkR
shell.
SQL
En af anvendelsesmulighederne for Spark SQL er at udføre SQL-forespørgsler.Spark SQL kan også bruges til at læse data fra en eksisterende Hive-installation. For yderligere oplysninger om, hvordan du konfigurerer denne funktion, henvises til afsnittet Hive-tabeller. Når du kørerSQL fra et andet programmeringssprog, vil resultaterne blive returneret som et Dataset/DataFrame.Du kan også interagere med SQL-grænsefladen ved hjælp af kommandolinjen eller via JDBC/ODBC.
Datasets og DataFrames
Et Dataset er en distribueret samling af data.Dataset er en ny grænseflade, der blev tilføjet i Spark 1.6, og som giver fordelene ved RDD’er (stærk typning, mulighed for at bruge kraftfulde lambda-funktioner) med fordelene ved Spark SQL’s optimerede eksekveringsmotor. Et Dataset kan konstrueres fra JVM-objekter og dereftermanipuleres ved hjælp af funktionelle transformationer (map
, flatMap
, filter
osv.) Dataset API’et er tilgængeligt i Scala og Java. Python har ikke understøttelse af Dataset API’et. Men på grund af Pythons dynamiske natur er mange af fordelene ved Dataset API’et allerede tilgængelige (f.eks. kan du få adgang til feltet i en række ved navn naturligvisrow.columnName
). Tilfældet for R er tilsvarende.
Et DataFrame er et Dataset organiseret i navngivne kolonner. Det er begrebsmæssigt ækvivalent med en tabel i en relationel database eller en dataramme i R/Python, men med rigere optimeringer under motorhjelmen. DataFrames kan konstrueres fra en lang række kilder såsom: strukturerede datafiler, tabeller i Hive, eksterne databaser eller eksisterende RDD’er.DataFrame API’et er tilgængeligt i Scala, Java, Python og R.I Scala og Java repræsenteres et DataFrame af et Dataset af Row
s.I Scala API’et er DataFrame
simpelthen et typealias for Dataset
.I Java API’et skal brugerne bruge Dataset<Row>
til at repræsentere et DataFrame
.
I hele dette dokument vil vi ofte henvise til Scala/Java Datasets af Row
s som DataFrames.