Join-Transformation in einem ZuordnungsdatenflussJoin transformation in mapping data flow

GILT FÜR: Azure Data Factory Azure Synapse Analytics

Mithilfe der Join-Transformation können Sie Daten aus zwei Quellen oder Streams in einem Zuordnungsdatenfluss miteinander kombinieren.Use the join transformation to combine data from two sources or streams in a mapping data flow. Der Ausgabestream enthält alle Spalten aus beiden Quellen, die auf der Grundlage einer Verknüpfungsbedingung abgeglichen wurden.The output stream will include all columns from both sources matched based on a join condition.

Join-TypenJoin types

Von Zuordnungsdatenflüssen werden aktuell fünf verschiedene Jointypen unterstützt:Mapping data flows currently supports five different join types.

Innerer JoinInner Join

Bei einem inneren Join werden nur Zeilen ausgegeben, die übereinstimmende Werte in beiden Tabellen enthalten.Inner join only outputs rows that have matching values in both tables.

Linker äußerer JoinLeft Outer

Bei einem linken äußeren Join werden alle Zeilen aus dem linken Stream sowie übereinstimmende Datensätze aus dem rechten Stream zurückgegeben.Left outer join returns all rows from the left stream and matched records from the right stream. Ist für eine Zeile aus dem linken Stream keine Übereinstimmung vorhanden, werden die Ausgabespalten aus dem rechten Stream auf NULL festgelegt.If a row from the left stream has no match, the output columns from the right stream are set to NULL. Die Ausgabe umfasst die von einem inneren Join zurückgegebenen Zeilen sowie die nicht übereinstimmenden Zeilen aus dem linken Stream.The output will be the rows returned by an inner join plus the unmatched rows from the left stream.

Hinweis

Bei der von Datenflüssen verwendeten Spark-Engine wird aufgrund etwaiger kartesischer Produkte in Ihren Joinbedingungen gelegentlich ein Fehler auftreten.The Spark engine used by data flows will occasionally fail due to possible cartesian products in your join conditions. Wenn dies der Fall ist, können Sie zu einem benutzerdefinierten Kreuzprodukt wechseln und die Joinbedingung manuell eingeben.If this occurs, you can switch to a custom cross join and manually enter your join condition. Dies kann zu einer geringeren Leistung in Ihren Datenflüssen führen, da die Ausführungs-Engine u. U. alle Zeilen von beiden Seiten der Beziehung berechnen und dann Zeilen filtern muss.This may result in slower performance in your data flows as the execution engine may need to calculate all rows from both sides of the relationship and then filter rows.

Rechter äußerer JoinRight Outer

Bei einem rechten äußeren Join werden alle Zeilen aus dem rechten Stream sowie übereinstimmende Datensätze aus dem linken Stream zurückgegeben.Right outer join returns all rows from the right stream and matched records from the left stream. Ist für eine Zeile aus dem rechten Stream keine Übereinstimmung vorhanden, werden die Ausgabespalten aus dem linken Stream auf NULL festgelegt.If a row from the right stream has no match, the output columns from the left stream are set to NULL. Die Ausgabe umfasst die von einem inneren Join zurückgegebenen Zeilen sowie die nicht übereinstimmenden Zeilen aus dem rechten Stream.The output will be the rows returned by an inner join plus the unmatched rows from the right stream.

Vollständiger äußerer JoinFull Outer

Bei einem vollständigen äußeren Join werden alle Spalten und Zeilen von beiden Seiten zurückgegeben. Spalten ohne Übereinstimmung erhalten jeweils einen NULL-Wert.Full outer join outputs all columns and rows from both sides with NULL values for columns that aren't matched.

Benutzerdefiniertes KreuzproduktCustom cross join

Bei einem Kreuzprodukt wird das Kreuzprodukt der beiden Streams auf der Grundlage einer Bedingung ausgegeben.Cross join outputs the cross product of the two streams based upon a condition. Geben Sie bei Verwendung einer Ungleichheitsbedingung einen benutzerdefinierten Ausdruck als Kreuzproduktbedingung an.If you're using a condition that isn't equality, specify a custom expression as your cross join condition. Der Ausgabestream umfasst alle Zeilen, die der Verknüpfungsbedingung entsprechen.The output stream will be all rows that meet the join condition.

Dieser Jointyp kann für Nicht-Gleichheitsverknüpfungen und OR-Bedingungen verwendet werden.You can use this join type for non-equi joins and OR conditions.

Wenn Sie explizit ein vollständiges kartesisches Produkt erzeugen möchten, verwenden Sie vor dem Join die Transformation für abgeleitete Spalten in beiden unabhängigen Datenströmen, um einen synthetischen Schlüssel für den Vergleich zu erstellen.If you would like to explicitly produce a full cartesian product, use the Derived Column transformation in each of the two independent streams before the join to create a synthetic key to match on. Erstellen Sie z. B. mit der Transformation für abgeleitete Spalten eine neue Spalte in jedem Datenstrom mit dem Namen SyntheticKey und legen Sie ihn auf 1 fest.For example, create a new column in Derived Column in each stream called SyntheticKey and set it equal to 1. Verwenden Sie dann a.SyntheticKey == b.SyntheticKey als benutzerdefinierten Joinausdruck.Then use a.SyntheticKey == b.SyntheticKey as your custom join expression.

Hinweis

Achten Sie darauf, dass Sie mindestens eine Spalte von jeder Seite der linken und rechten Beziehung in ein benutzerdefiniertes Kreuzprodukt einbeziehen.Make sure to include at least one column from each side of your left and right relationship in a custom cross join. Die Ausführung von Kreuzprodukten mit statischen Werten anstelle von Spalten von jeder Seite führt zu vollständigen Überprüfungen des gesamten Datasets, sodass der Datenfluss mit geringer Leistung ausgeführt wird.Executing cross joins with static values instead of columns from each side results in full scans of the entire dataset, causing your data flow to perform poorly.

KonfigurationConfiguration

  1. Wählen Sie in der Dropdownliste Rechter Stream den Datenstrom für die Verknüpfung aus.Choose which data stream you're joining with in the Right stream dropdown.
  2. Wählen Sie unter Jointyp den gewünschten Jointyp aus.Select your Join type
  3. Wählen Sie die Schlüsselspalten aus, auf denen der Abgleich für Ihre Verknüpfungsbedingung basieren soll.Choose which key columns you want to match on for you join condition. Standardmäßig sucht der Datenfluss nach Übereinstimmung mit einer Spalte in jedem Datenstrom.By default, data flow looks for equality between one column in each stream. Wenn der Vergleich auf einem berechneten Wert basieren soll, zeigen Sie mit dem Mauszeiger auf die Dropdownliste für die Spalte, und wählen Sie Berechnete Spalte aus.To compare via a computed value, hover over the column dropdown and select Computed column.

Join-TransformationJoin Transformation

Nicht-GleichheitsverknüpfungenNon-equi joins

Wenn Sie in Ihren Joinbedingungen einen bedingten Operator wie „ungleich“ „(!=)“ oder „größer als“ „(>)“ verwenden möchten, ändern Sie die Dropdownliste des Operators zwischen den beiden Spalten.To use a conditional operator such as not equals (!=) or greater than (>) in your join conditions, change the operator dropdown between the two columns. Bei Nicht-Gleichheitsverknüpfungen muss mindestens einer der beiden Datenströme mithilfe der Übertragungsoption Fixed (Fest) auf der Registerkarte Optimieren übertragen werden.Non-equi joins require at least one of the two streams to be broadcasted using Fixed broadcasting in the Optimize tab.

Nicht-GleichheitsverknüpfungNon-equi join

Optimieren der Leistung beim VerknüpfenOptimizing join performance

Im Gegensatz zu „Merge Join“ in Tools wie SSIS ist die Join-Transformation kein obligatorischer Vorgang vom Typ „Merge Join“.Unlike merge join in tools like SSIS, the join transformation isn't a mandatory merge join operation. Die Join-Schlüssel müssen nicht sortiert werden.The join keys don't require sorting. Der Join-Vorgang erfolgt basierend auf dem optimalen Join-Vorgang in Spark (Broadcast- oder Map-Side-Join).The join operation occurs based on the optimal join operation in Spark, either broadcast or map-side join.

Optimieren der Join-TransformationJoin Transformation optimize

Wenn bei Joins, Suchvorgängen und Exists-Transformationen der Arbeitsspeicher des Workerknotens groß genug für einen oder beide Datenströme ist, können Sie die Leistung optimieren, indem Sie die Übertragung aktivieren.In joins, lookups and exists transformation, if one or both data streams fit into worker node memory, you can optimize performance by enabling Broadcasting. Standardmäßig entscheidet die Spark-Engine automatisch, ob eine Seite übertragen werden soll oder nicht.By default, the spark engine will automatically decide whether or not to broadcast one side. Klicken Sie auf Fest , um die zu übertragende Seite manuell auszuwählen.To manually choose which side to broadcast, select Fixed.

Es wird nicht empfohlen, die Übertragung über die Option Off (Aus) zu deaktivieren, es sei denn, für Ihre Joins treten Timeoutfehler auf.It's not recommended to disable broadcasting via the Off option unless your joins are running into timeout errors.

SelbstverknüpfungSelf-Join

Wenn Sie einen Datenstrom mit sich selbst verknüpfen möchten, müssen Sie einen vorhandenen Stream per Auswahltransformation mit einem Alias versehen.To self-join a data stream with itself, alias an existing stream with a select transformation. Erstellen Sie einen neuen Branch, indem Sie neben einer Transformation auf das Pluszeichen klicken und Neuer Branch auswählen.Create a new branch by clicking on the plus icon next to a transformation and selecting New branch. Fügen Sie eine Auswahltransformation hinzu, um den ursprünglichen Stream mit einem Alias zu versehen.Add a select transformation to alias the original stream. Fügen Sie eine Join-Transformation hinzu. Wählen Sie dabei den ursprünglichen Stream als Linker Stream und die Auswahltransformation als Rechter Stream aus.Add a join transformation and choose the original stream as the Left stream and the select transformation as the Right stream.

SelbstverknüpfungSelf-join

Testen der Join-BedingungenTesting join conditions

Verwenden Sie einen kleinen Satz bekannter Daten, wenn Sie die Join-Transformationen mit Datenvorschau im Debugmodus testen.When testing the join transformations with data preview in debug mode, use a small set of known data. Bei der Stichprobenentnahme aus einem umfangreichen Dataset können Sie nicht vorhersagen, welche Zeilen und Schlüssel zu Testzwecken gelesen werden.When sampling rows from a large dataset, you can't predict which rows and keys will be read for testing. Das Ergebnis ist nicht deterministisch. Das bedeutet, dass für Ihre Verknüpfungsbedingungen möglicherweise keine Übereinstimmungen zurückgegeben werden.The result is non-deterministic, meaning that your join conditions may not return any matches.

DatenflussskriptData flow script

SyntaxSyntax

<leftStream>, <rightStream>
    join(
        <conditionalExpression>,
        joinType: { 'inner'> | 'outer' | 'left_outer' | 'right_outer' | 'cross' }
        broadcast: { 'auto' | 'left' | 'right' | 'both' | 'off' }
    ) ~> <joinTransformationName>

Beispiel für einen inneren JoinInner join example

Das folgende Beispiel ist eine Join-Transformation namens JoinMatchedData mit dem linken Stream TripData und dem rechten Stream TripFare.The below example is a join transformation named JoinMatchedData that takes left stream TripData and right stream TripFare. Die Verknüpfungsbedingung ist der Ausdruck hack_license == { hack_license} && TripData@medallion == TripFare@medallion && vendor_id == { vendor_id} && pickup_datetime == { pickup_datetime}, der „true“ zurückgibt, wenn die Spalten hack_license, medallion, vendor_id und pickup_datetime in den beiden Streams übereinstimmen.The join condition is the expression hack_license == { hack_license} && TripData@medallion == TripFare@medallion && vendor_id == { vendor_id} && pickup_datetime == { pickup_datetime} that returns true if the hack_license, medallion, vendor_id, and pickup_datetime columns in each stream match. Der Jointyp (joinType) lautet 'inner'.The joinType is 'inner'. Da Broadcasting nur im linken Stream aktiviert wird, hat broadcast den Wert 'left'.We're enabling broadcasting in only the left stream so broadcast has value 'left'.

Auf der Data Factory-Benutzeroberfläche sieht diese Transformation wie folgt aus:In the Data Factory UX, this transformation looks like the below image:

Screenshot der Transformation mit ausgewählter Registerkarte für Joineinstellungen und dem Jointyp „Innerer“Screenshot shows the transformation with the Join Settings tab selected and a Join type of Inner.

Das Datenflussskript für diese Transformation befindet sich im folgenden Codeausschnitt:The data flow script for this transformation is in the snippet below:

TripData, TripFare
    join(
        hack_license == { hack_license}
        && TripData@medallion == TripFare@medallion
        && vendor_id == { vendor_id}
        && pickup_datetime == { pickup_datetime},
        joinType:'inner',
        broadcast: 'left'
    )~> JoinMatchedData

Beispiel für ein benutzerdefiniertes KreuzproduktCustom cross join example

Das folgende Beispiel ist eine Join-Transformation namens JoiningColumns mit dem linken Stream LeftStream und dem rechten Stream RightStream.The below example is a join transformation named JoiningColumns that takes left stream LeftStream and right stream RightStream. Diese Transformation übernimmt zwei Streams und verknüpft alle Zeilen, in denen die Spalte leftstreamcolumn größer als die Spalte rightstreamcolumn ist.This transformation takes in two streams and joins together all rows where column leftstreamcolumn is greater than column rightstreamcolumn. Der Jointyp (joinType) lautet cross.The joinType is cross. Broadcasting ist nicht aktiviert, broadcast weist den Wert 'none' auf.Broadcasting is not enabled broadcast has value 'none'.

Auf der Data Factory-Benutzeroberfläche sieht diese Transformation wie folgt aus:In the Data Factory UX, this transformation looks like the below image:

Screenshot der Transformation mit ausgewählter Registerkarte für Joineinstellungen und dem Jointyp „Benutzerdefiniert“ (Kreuzprodukt)Screenshot shows the transformation with the Join Settings tab selected and a Join type of Custom (cross).

Das Datenflussskript für diese Transformation befindet sich im folgenden Codeausschnitt:The data flow script for this transformation is in the snippet below:

LeftStream, RightStream
    join(
        leftstreamcolumn > rightstreamcolumn,
        joinType:'cross',
        broadcast: 'none'
    )~> JoiningColumns

Nächste SchritteNext steps

Erstellen Sie nach dem Verknüpfen von Daten eine abgeleitete Spalte, und senken Sie Ihre Daten in einen Zieldatenspeicher.After joining data, create a derived column and sink your data to a destination data store.