Visualisaties

Azure Databricks ondersteunt verschillende soorten kant-en-klare visualisaties met behulp van de display- en displayHTML-functie.

Azure Databricks biedt ook systeemeigen ondersteuning voor visualisatiebibliotheken in Python en R en laat u bibliotheken van derden installeren en gebruiken.

display-functie

De display-functie ondersteunt een aantal gegevens- en visualisatietypen.

In deze sectie:

Gegevenstypen

DataFrames

De gemakkelijkste manier om een DataFrame-visualisatie in Azure Databricks te maken, is door display(<dataframe-name>) aan te roepen. Als u bijvoorbeeld een Spark DataFrame van een gegevensset met ruiten hebt gegroepeerd op ruitkleur, de gemiddelde prijs berekenen diamonds_df en u aanroept:

from pyspark.sql.functions import avg
diamonds_df = spark.read.csv("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv", header="true", inferSchema="true")

display(diamonds_df.select("color","price").groupBy("color").agg(avg("price")))

Er wordt een tabel met een ruitkleur vergeleken met de gemiddelde prijs weergegeven.

Ruitkleur versus gemiddelde prijs

Tip

Als u OK zonder weergave ziet nadat u de display-functie hebt aangeroepen, is de DataFrame of verzameling die u hebt doorgegeven waarschijnlijk leeg.

display()ondersteunt display() Als u verwijst naar een DataFrame in pandas of Pandas API in Spark zonder , wordt de tabel weergegeven zoals deze in een Jupyter-notebook zou zijn.

display-methode voor DataFrames

Notitie

Beschikbaar in Databricks Runtime 7.1 en hoger.

DataFrames in PySpark,pandas en Pandas-API in Spark hebben een methode waarmee de functie Azure Databricks aanroept. U kunt deze functie aanroepen na een eenvoudige DataFrame-bewerking, bijvoorbeeld:

diamonds_df = spark.read.csv("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv", header="true", inferSchema="true")
diamonds_df.select("color","price").display()

of aan het einde van een reeks geketende DataFrame-bewerkingen, bijvoorbeeld:

from pyspark.sql.functions import avg
diamonds_df = spark.read.csv("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv", header="true", inferSchema="true")

diamonds_df.select("color","price").groupBy("color").agg(avg("price")).display()
Gegevensprofielen

Belangrijk

Deze functie is beschikbaar als openbare preview.

Notitie

Beschikbaar in Databricks Runtime 9.1 en hoger.

Vanaf Databricks Runtime 9.1 worden er twee tabbladen weergegeven in het resultatenvenster wanneer u de methode DataFrame displayTable gebruikt: en Data Profile . Tabletoont de resultaten in tabelvorm en geeft u toegang tot ingebouwde Table Data Profile geeft samenvattingsstatistieken weer van het Apache Spark of pandas DataFrame in tabelvorm en grafische indeling.

Gegevensprofiel

  • Numerieke en categorische functies worden weergegeven in afzonderlijke tabellen.
  • Boven aan het tabblad kunt u functies sorteren of zoeken.
  • Bovenaan de grafiekkolom kunt u ervoor kiezen om een histogram(Standard)of kwantielen weer te geven.
  • Controleer uitbreiden om de grafieken te vergroten.
  • Controleer het logboek om de grafieken op een logboekschaal weer te geven.
  • U kunt de cursor over de grafieken bewegen voor meer gedetailleerde informatie, zoals de grenzen van een histogramkolom en het aantal rijen in de kolom, of de kwantielwaarde.

Notitie

Als u gegevensprofielen wilt zien, moet u de syntaxis display(df) gebruiken. De df.display() syntaxis wordt niet ondersteund.

U kunt ook gegevensprofielen genereren via een programma; zie de opdracht summarize (dbutils.data.summarize).

Afbeeldingen

display geeft kolommen weer die afbeeldingsgegevenstypen als uitgebreide HTML bevatten. displayprobeert miniatuurafbeeldingen weer te geven voor DataFrame kolommen die overeenkomen met het Spark display Miniatuurweergave werkt voor alle afbeeldingen die zijn ingelezen via de spark.read.format('image') functie . Voor afbeeldingswaarden die op een andere manier worden gegenereerd, ondersteunt Azure Databricks de weergave van 1-, 3- of 4-kanaals afbeeldingen (waarbij elk kanaal uit één byte bestaat), met de volgende beperkingen:

  • Afbeeldingen met één kanaal: het veld moet gelijk zijn aan 0. De velden height, width en nChannels moeten de binaire afbeeldingsgegevens in het veld data nauwkeurig beschrijven.
  • Afbeeldingen met drie kanalen: het veld moet gelijk zijn aan 16. De velden height, width en nChannels moeten de binaire afbeeldingsgegevens in het veld data nauwkeurig beschrijven. Het veld data moet pixelgegevens in chunks van 3 byte bevatten, waarbij het kanaal (blue, green, red) ordent voor elke pixel.
  • Vierkanaals afbeeldingen: het veld moet gelijk zijn aan 24. De velden height, width en nChannels moeten de binaire afbeeldingsgegevens in het veld data nauwkeurig beschrijven. Het veld data moet pixelgegevens in chunks van 4 byte bevatten, waarbij het kanaal (blue, green, red, alpha) ordent voor elke pixel.
Voorbeeld

Stel dat u een map hebt die wat afbeeldingen bevat:

Map met afbeeldingsgegevens

Als u de afbeeldingen met ImageSchema.readImages in een DataFrame leest en de DataFrame vervolgens weergeeft, geeft display miniaturen van de afbeeldingen weer:

from pyspark.ml.image import ImageSchema
image_df = ImageSchema.readImages(sample_img_dir)
display(image_df)

DataFrame van afbeelding weergeven

Gestructureerd streamen-DataFrames

Als u het resultaat van een streaming-query in realtime wilt visualiseren, kunt u een Gestructureerd streamen-DataFrame display in Scala en Python.

Python
streaming_df = spark.readStream.format("rate").load()
display(streaming_df.groupBy().count())
Scala
val streaming_df = spark.readStream.format("rate").load()
display(streaming_df.groupBy().count())

display ondersteunt de volgende optionele parameters:

  • streamName: de naam van de streaming-query.
  • trigger (Scala) en processingTime (Python): definieert hoe vaak de streaming-query wordt uitgevoerd. Als dit niet is opgegeven, controleert het systeem op beschikbaarheid van nieuwe gegevens zodra de vorige verwerking is voltooid. Om de kosten in productie te verlagen, raadt Databricks aan om altijd een triggerinterval in te stellen. Bij Databricks Runtime 8.0 en hoger is het triggerinterval standaard op 500 ms ingesteld.
  • checkpointLocation: de locatie waar het systeem alle controlepuntgegevens schrijft. Als dit niet is opgegeven, genereert het systeem automatisch een tijdelijke controlepuntlocatie op DBFS. U moet een controlepuntlocatie opgeven zodat uw stream de gegevensverwerking kan hervatten vanaf het punt waar het gebleven was. Databricks raadt aan dat u in productie altijd de optie opgeeft.
Python
streaming_df = spark.readStream.format("rate").load()
display(streaming_df.groupBy().count(), processingTime = "5 seconds", checkpointLocation = "dbfs:/<checkpoint-path>")
Scala
import org.apache.spark.sql.streaming.Trigger

val streaming_df = spark.readStream.format("rate").load()
display(streaming_df.groupBy().count(), trigger = Trigger.ProcessingTime("5 seconds"), checkpointLocation = "dbfs:/<checkpoint-path>")

Zie Streaming-query’s starten voor meer informatie over deze parameters.

Tekentypen

De display-functie ondersteunt een uitgebreide verzameling tekentypen:

Grafiektypen

Een grafiektype kiezen en configureren

Als u een staafdiagram wilt kiezen, klikt u op het staafdiagrampictogram Grafiekknop:

Pictogram staafdiagram

Als u een ander plottype wilt kiezen, klikt u op Knop omlaag rechts van de staafdiagramgrafiekknop en kiest u het type plot.

Grafiekwerkbalk

Zowel lijn- als staafdiagrammen hebben een ingebouwde werkbalk die een uitgebreide verzameling interacties aan de clientzijde ondersteunt.

Grafiekwerkbalk

Als u een grafiek wilt configureren, klikt u op Tekenopties… .

Opties voor plotten

Het lijndiagram heeft een aantal aangepaste grafiekopties: een bereik voor de y-as instellen, punten weergeven en verbergen, en de y-as met een logaritmische schaal weergeven.

Voor informatie over verouderde grafiektypen bekijkt u:

Kleurconsistentie in grafieken

Azure Databricks ondersteunt twee soorten kleurconsistentie in grafieken: set reeksen en globaal.

De kleurconsistentie van reeksen wordt aan dezelfde waarde toegewezen als u reeksen met dezelfde waarden hebt, maar in verschillende orders (bijvoorbeeld A = en B = ["Orange", "Banana", "Apple"] ). De waarden worden gesorteerd voordat ze worden getekend, zodat beide legenda’s op dezelfde manier worden gesorteerd (["Apple", "Banana", "Orange"]) en dezelfde waarden dezelfde kleuren krijgen. Als u echter een reeks C = ["Orange", "Banana"] hebt, zou deze niet kleurconsistent zijn met reeks A omdat de reeks niet hetzelfde is. Het sorteringsalgoritme zou de eerste kleur toewijzen aan ‘Banaan’ in reeks C, maar de tweede kleur aan ‘Banaan’ in reeks A. Als u wilt dat deze reeksen kleurconsistent zijn, kunt u opgeven dat grafieken een globale kleurconsistentie moeten hebben.

Met globale kleurconsistentie wordt elke waarde altijd aan dezelfde kleur toegewezen, ongeacht de waarden die de reeksen hebben. Als u dit wilt inschakelen voor elke grafiek, schakelt u het selectievakje Globale kleurconsistentie in.

Globale kleurconsistentie

Notitie

Om deze consistentie te bereiken, hasht Azure Databricks rechtstreeks van waarden naar kleuren. Om botsingen te vermijden (waarbij twee waarden naar precies dezelfde kleur gaan), wordt er naar een grote verzameling kleuren gehasht, wat als gevolg heeft dat aantrekkelijke of gemakkelijk te onderscheiden kleuren niet gegarandeerd kunnen worden; met zo veel kleuren zijn er geheid een aantal die veel op elkaar lijken.

Machine learning-visualisaties

Naast de standaard grafiektypen ondersteunt de display-functie ook visualisaties van de volgende machine learning-trainingsparameters en -resultaten:

Residuen

Voor lineaire en logistieke regressies ondersteunt display het weergeven van een aangepast versus display Om deze grafiek te verkrijgen, levert u het model en de DataFrame.

Met het volgende voorbeeld wordt een lineaire regressie uitgevoerd op stadsbevolking tegen verkoopprijzen van huizen en worden vervolgens de residuen- versus aangepaste gegevens weergegeven.

# Load data
pop_df = spark.read.csv("/databricks-datasets/samples/population-vs-price/data_geo.csv", header="true", inferSchema="true")

# Drop rows with missing values and rename the feature and label columns, replacing spaces with _
from pyspark.sql.functions import col
pop_df = pop_df.dropna() # drop rows with missing values
exprs = [col(column).alias(column.replace(' ', '_')) for column in pop_df.columns]

# Register a UDF to convert the feature (2014_Population_estimate) column vector to a VectorUDT type and apply it to the column.
from pyspark.ml.linalg import Vectors, VectorUDT

spark.udf.register("oneElementVec", lambda d: Vectors.dense([d]), returnType=VectorUDT())
tdata = pop_df.select(*exprs).selectExpr("oneElementVec(2014_Population_estimate) as features", "2015_median_sales_price as label")

# Run a linear regression
from pyspark.ml.regression import LinearRegression

lr = LinearRegression()
modelA = lr.fit(tdata, {lr.regParam:0.0})

# Plot residuals versus fitted data
display(modelA, tdata)

Residuen weergeven

ROC-curves

Voor logistieke regressies ondersteunt display het weergeven van een display Om deze grafiek te verkrijgen, levert u het model, de voorbereide gegevens die invoer zijn voor de fit-methode, en de parameter "ROC".

In het volgende voorbeeld wordt een classificatie ontwikkeld die voorspelt of een persoon < = 50.000 of 50.000 per jaar verdient op basis van verschillende kenmerken > van de persoon. De gegevensset Volwassen is afgeleid van censusgegevens en bestaat uit informatie over 48.842 individuen en hun jaarlijkse inkomen.

In de voorbeeldcode in dit gedeelte wordt gebruikgemaakt van dynamische codering. De functie is hernoemd met Apache Spark 3.0, dus de code verschilt enigszins, afhankelijk van de Databricks Runtime-versie die u gebruikt. Als u Databricks Runtime 6.x of lager gebruikt, moet u twee regels in de code aanpassen, zoals is beschreven in de code-opmerkingen.


# This code uses one-hot encoding to convert all categorical variables into binary vectors.

schema = """`age` DOUBLE,
`workclass` STRING,
`fnlwgt` DOUBLE,
`education` STRING,
`education_num` DOUBLE,
`marital_status` STRING,
`occupation` STRING,
`relationship` STRING,
`race` STRING,
`sex` STRING,
`capital_gain` DOUBLE,
`capital_loss` DOUBLE,
`hours_per_week` DOUBLE,
`native_country` STRING,
`income` STRING"""

dataset = spark.read.csv("/databricks-datasets/adult/adult.data", schema=schema)

from pyspark.ml import Pipeline
from pyspark.ml.feature import OneHotEncoder, StringIndexer, VectorAssembler
# If you are using Databricks Runtime 6.x or below, comment out the preceding line and uncomment the following line.
# from pyspark.ml.feature import OneHotEncoderEstimator, StringIndexer, VectorAssembler
categoricalColumns = ["workclass", "education", "marital_status", "occupation", "relationship", "race", "sex", "native_country"]

stages = [] # stages in the Pipeline
for categoricalCol in categoricalColumns:
    # Category indexing with StringIndexer
    stringIndexer = StringIndexer(inputCol=categoricalCol, outputCol=categoricalCol + "Index")
    # Use OneHotEncoder to convert categorical variables into binary SparseVectors
    encoder = OneHotEncoder(inputCols=[stringIndexer.getOutputCol()], outputCols=[categoricalCol + "classVec"])
    # If you are using Databricks Runtime 6.x or below, comment out the preceding line and uncomment the following line.
    # encoder = OneHotEncoderEstimator(inputCols=[stringIndexer.getOutputCol()], outputCols=[categoricalCol + "classVec"])
    # Add stages.  These are not run here, but will run all at once later on.
    stages += [stringIndexer, encoder]

# Convert label into label indices using the StringIndexer
label_stringIdx = StringIndexer(inputCol="income", outputCol="label")
stages += [label_stringIdx]

# Transform all features into a vector using VectorAssembler
numericCols = ["age", "fnlwgt", "education_num", "capital_gain", "capital_loss", "hours_per_week"]
assemblerInputs = [c + "classVec" for c in categoricalColumns] + numericCols
assembler = VectorAssembler(inputCols=assemblerInputs, outputCol="features")
stages += [assembler]

# Run the stages as a Pipeline. This puts the data through all of the feature transformations in a single call.

partialPipeline = Pipeline().setStages(stages)
pipelineModel = partialPipeline.fit(dataset)
preppedDataDF = pipelineModel.transform(dataset)

# Fit logistic regression model

from pyspark.ml.classification import LogisticRegression
lrModel = LogisticRegression().fit(preppedDataDF)

# ROC for data
display(lrModel, preppedDataDF, "ROC")

ROC weergeven

Om de residuen weer te geven, laat u de parameter "ROC" weg:

display(lrModel, preppedDataDF)

Logistische regressie residuen weergeven

Beslissingsstructuren

De display-functie ondersteunt de weergave van een beslissingsstructuur.

Om deze visualisatie te verkrijgen, levert u het beslissingsstructuurmodel.

Met de volgende voorbeelden wordt een structuur getraind om cijfers (0-9) te herkennen uit de MNIST-gegevensset met afbeeldingen van handgeschreven cijfers en wordt de structuur vervolgens weergegeven.

Python
trainingDF = spark.read.format("libsvm").load("/databricks-datasets/mnist-digits/data-001/mnist-digits-train.txt").cache()
testDF = spark.read.format("libsvm").load("/databricks-datasets/mnist-digits/data-001/mnist-digits-test.txt").cache()

from pyspark.ml.classification import DecisionTreeClassifier
from pyspark.ml.feature import StringIndexer
from pyspark.ml import Pipeline

indexer = StringIndexer().setInputCol("label").setOutputCol("indexedLabel")

dtc = DecisionTreeClassifier().setLabelCol("indexedLabel")

# Chain indexer + dtc together into a single ML Pipeline.
pipeline = Pipeline().setStages([indexer, dtc])

model = pipeline.fit(trainingDF)
display(model.stages[-1])
Scala
val trainingDF = spark.read.format("libsvm").load("/databricks-datasets/mnist-digits/data-001/mnist-digits-train.txt").cache
val testDF = spark.read.format("libsvm").load("/databricks-datasets/mnist-digits/data-001/mnist-digits-test.txt").cache

import org.apache.spark.ml.classification.{DecisionTreeClassifier, DecisionTreeClassificationModel}
import org.apache.spark.ml.feature.StringIndexer
import org.apache.spark.ml.Pipeline

val indexer = new StringIndexer().setInputCol("label").setOutputCol("indexedLabel")
val dtc = new DecisionTreeClassifier().setLabelCol("indexedLabel")
val pipeline = new Pipeline().setStages(Array(indexer, dtc))

val model = pipeline.fit(trainingDF)
val tree = model.stages.last.asInstanceOf[DecisionTreeClassificationModel]

display(tree)

Beslissingsstructuur weergeven

displayHTML-functie

Azure Databricks-programmeertaalnotebooks (Python, R en Scala) ondersteunen HTML-afbeeldingen met behulp van de displayHTML-functie; u kunt elke HTML-, CSS- of JavaScript-code aan de functie doorgeven. Deze functie ondersteunt interactieve afbeeldingen die gebruikmaken van JavaScript-bibliotheken zoals D3.

Voor voorbeelden van het gebruik van displayHTML bekijkt u:

Notitie

Het iframe displayHTML wordt aangeleverd vanuit het domein databricksusercontent.com, en de iframe-sandbox bevat het kenmerk allow-same-origin. databricksusercontent.com moet toegankelijk zijn via uw browser. Als het momenteel door uw bedrijfsnetwerk wordt geblokkeerd, moet het aan een acceptatielijst worden toegevoegd.

Visualisaties per taal

In deze sectie:

Visualisaties in Python

Als u gegevens wilt tekenen in Python, gebruikt u de display-functie als volgt:

diamonds_df = spark.read.csv("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv", header="true", inferSchema="true")

display(diamonds_df.groupBy("color").avg("price").orderBy("color"))

Python-staafdiagram

In deze sectie:

Notebook met gedetailleerde informatie over Python

Voor gedetailleerde informatie over Python-visualisaties met behulp van display bekijkt u het notebook:

Seaborn

U kunt ook andere Python-bibliotheken gebruiken om grafieken te genereren. De Databricks Runtime bevat de visualisatiebibliotheek Seaborn. Als u een Seaborn-grafiek wilt maken, importeert u de bibliotheek, maakt u een grafiek en geeft u de grafiek door aan de display-functie.

import seaborn as sns
sns.set(style="white")

df = sns.load_dataset("iris")
g = sns.PairGrid(df, diag_sharey=False)
g.map_lower(sns.kdeplot)
g.map_diag(sns.kdeplot, lw=3)

g.map_upper(sns.regplot)

display(g.fig)

Seaborn-plot

Andere Python-bibliotheken

Visualisaties in R

Als u gegevens wilt tekenen in R, gebruikt u de display-functie als volgt:

library(SparkR)
diamonds_df <- read.df("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv", source = "csv", header="true", inferSchema = "true")

display(arrange(agg(groupBy(diamonds_df, "color"), "price" = "avg"), "color"))

U kunt de standaard grafiek-functie van R gebruiken.

fit <- lm(Petal.Length ~., data = iris)
layout(matrix(c(1,2,3,4),2,2)) # optional 4 graphs/page
plot(fit)

R-standaardplot

U kunt ook elk R-visualisatiepakket gebruiken. Met het R-notebook wordt de resulterende grafiek als een .png vastgelegd en inline weergegeven.

In deze sectie:

Lattice

Het Lattice-pakket ondersteunt latwerkgrafieken: grafieken die een variabele of de relatie tussen variabelen weergeven, met een of meer andere variabelen als voorwaarde.

library(lattice)
xyplot(price ~ carat | cut, diamonds, scales = list(log = TRUE), type = c("p", "g", "smooth"), ylab = "Log price")

R Lattice-plot

DandEFA

Het DandEFA-pakket ondersteunt paardenbloemgrafieken.

install.packages("DandEFA", repos = "https://cran.us.r-project.org")
library(DandEFA)
data(timss2011)
timss2011 <- na.omit(timss2011)
dandpal <- rev(rainbow(100, start = 0, end = 0.2))
facl <- factload(timss2011,nfac=5,method="prax",cormeth="spearman")
dandelion(facl,bound=0,mcex=c(1,1.2),palet=dandpal)
facl <- factload(timss2011,nfac=8,method="mle",cormeth="pearson")
dandelion(facl,bound=0,mcex=c(1,1.2),palet=dandpal)

R DandEFA-plot

Plotly

Het Plotly-pakket is afhankelijk van htmlwidgets voor R. Zie htmlwidgets voor installatie-instructies en een notebook.

Andere R-bibliotheken

Visualisaties in Scala

Als u gegevens wilt tekenen in Scala, gebruikt u de display-functie als volgt:

val diamonds_df = spark.read.format("csv").option("header","true").option("inferSchema","true").load("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv")

display(diamonds_df.groupBy("color").avg("price").orderBy("color"))

Scala-staafdiagram

Notebook met gedetailleerde informatie over Scala

Voor gedetailleerde informatie over Scala-visualisaties met behulp van display bekijkt u het notebook:

Visualisaties in SQL

Wanneer u een SQL-query uitvoert, worden met Azure Databricks automatisch sommige van de gegevens geëxtraheerd en als een tabel weergegeven.

SELECT color, avg(price) AS price FROM diamonds GROUP BY color ORDER BY COLOR

SQL tabel

Van daaruit kunt u verschillende grafiektypen selecteren.

SQL staafdiagram

Gegevensprofielen in SQL

Belangrijk

Deze functie is beschikbaar als openbare preview.

Vanaf Databricks Runtime 9.1 worden twee tabbladen weergegeven in het Table resultatenvenster: en Data Profile . Table toont de resultaten in tabelvorm en geeft u toegang tot de verschillende grafiektypen. Data Profile geeft samenvattingsstatistieken weer van de tabel in tabelvorm en afbeeldingsindeling. Zie Gegevensprofielen voor een voorbeeldweergave en details over de weergegeven gegevensprofielen.