Delen via


Werken met koppelingen in Azure Databricks

Databricks biedt ondersteuning voor ansi-standaard-joinsyntaxis. In dit artikel worden verschillen tussen joins met batch- en streamverwerking beschreven.

Notitie

Databricks ondersteunt ook standaardsyntaxis voor de setoperatoren UNION, INTERSECTen EXCEPT. Zie Set operators.

Verschillen tussen streaming en batch-joins

Join-operaties op Azure Databricks zijn ofwel met of zonder toestand.

Alle batch-koppelingen zijn statusloze koppelingen. Resultaten worden onmiddellijk verwerkt en de data wordt weergegeven op het moment dat de query wordt uitgevoerd. Telkens wanneer de query wordt uitgevoerd, worden nieuwe resultaten berekend op basis van de opgegeven brongegevens. Zie Batch joins.

Joins tussen twee streaminggegevensbronnen zijn staatvol. In stateful joins houdt Azure Databricks informatie over de gegevensbronnen en de resultaten bij en worden de resultaten iteratief bijgewerkt. Stateful joins kunnen krachtige oplossingen bieden voor online gegevensverwerking, maar het kan lastig zijn om effectief te implementeren. Ze hebben complexe operationele semantiek, afhankelijk van de uitvoermodus, het triggerinterval en het watermerk. Zie Stream-stream joins.

Stream-statische joins zijn staatloos, maar bieden een goede optie voor het samenvoegen van een incrementele gegevensbron (zoals een feitentabel) met een statische gegevensbron (zoals een langzaam veranderende dimensionale tabel). In plaats van alle records van beide zijden samen te voegen telkens wanneer een query wordt uitgevoerd, worden alleen nieuw ontvangen records van de streamingbron gekoppeld aan de huidige versie van de statische tabel. Zie Stream-static joins.

Batchverwerkingen

Azure Databricks biedt ondersteuning voor standaardsyntaxis voor SQL-joins, waaronder inner, outer, semi, anti- en cross joins. Zie JOIN.

Notitie

Databricks raadt aan een gerealiseerde weergave te gebruiken om incrementele berekening van de resultaten van een inner join te optimaliseren. Bekijk gematerialiseerde weergaven.

Stream-stream-koppelingen

Het samenvoegen van twee streaminggegevensbronnen kan aanzienlijke uitdagingen opleveren bij het beheren van statusinformatie en het redeneren van resultatenberekening en -uitvoer. Voordat u een stream-stream join implementeert, raadt Databricks aan om een sterk inzicht te krijgen in de operationele semantiek voor stateful streaming, inclusief hoe watermerken van invloed zijn op statusbeheer. Zie de volgende artikelen:

Databricks raadt aan om watermerken op te geven voor beide kanten van alle stream-stream-koppelingen. De volgende jointypen worden ondersteund:

  • Interne koppelingen
  • Linker buitenste join
  • Rechterbuitenste joins
  • Volledige outer joins
  • Linker semi-verbindingen

Zie de documentatie voor gestructureerd streamen van Apache Spark over stream-stream joins.

Stream-statische verbindingen

Notitie

Bij het beschreven gedrag voor stream-statische joins wordt ervan uitgegaan dat de statische gegevens worden opgeslagen met behulp van Delta Lake.

Een stroom-statische join verbindt de meest recente geldige versie van een Delta-tabel (de statische gegevens) met een gegevensstroom met behulp van een stateless join.

Wanneer Azure Databricks een microbatch met gegevens verwerkt in een stroomstatische join, wordt de meest recente geldige versie van gegevens uit de statische Delta-tabel samengevoegd met de records die aanwezig zijn in de huidige microbatch. Omdat de join staatloos is, hoeft u geen watermerken te configureren en resultaten met lage latentie te verwerken. De gegevens in de statische Delta-tabel die in de join worden gebruikt, moeten langzaam worden gewijzigd.

In het volgende voorbeeld ziet u dit patroon:

streamingDF = spark.readStream.table("orders")
staticDF = spark.read.table("customers")

query = (streamingDF
  .join(staticDF, streamingDF.customer_id==staticDF.id, "inner")
  .writeStream
  .option("checkpointLocation", checkpoint_path)
  .table("orders_with_customer_info")
)

Hints toevoegen aan Azure Databricks

Apache Spark biedt ondersteuning voor het opgeven van join hints voor bereik joins en scheve joins. Hints voor scheve joins zijn niet nodig omdat Azure Databricks deze joins automatisch optimaliseert. Zie Hints

Hints voor bereik-koppelingen kunnen nuttig zijn als de prestaties van koppelingen slecht zijn en u ongelijkheidskoppelingen uitvoert. Voorbeelden hiervan zijn het combineren van tijdstempelbereiken of een bereik van clustering-ID's. Zie Bereik-joinoptimalisatie en join-prestaties optimaliseren in Azure Databricks.