Copie répétable dans Azure Data FactoryRepeatable copy in Azure Data Factory

Lecture renouvelée de sources relationnellesRepeatable read from relational sources

Lorsque vous copiez des données à partir de magasins de données relationnels, gardez à l’esprit la répétabilité de l’opération, afin d’éviter des résultats imprévus.When copying data from relational data stores, keep repeatability in mind to avoid unintended outcomes. Dans Azure Data Factory, vous pouvez réexécuter une tranche manuellement.In Azure Data Factory, you can rerun a slice manually. Vous pouvez également configurer une stratégie de nouvelles tentatives pour un jeu de données, afin qu’une tranche soit réexécutée en cas de défaillance.You can also configure retry policy for a dataset so that a slice is rerun when a failure occurs. Lorsqu’une tranche est réexécutée d’une manière ou d’une autre, vous devez vous assurer que les mêmes données sont lues et ce, quel que soit le nombre d’exécutions de la tranche.When a slice is rerun in either way, you need to make sure that the same data is read no matter how many times a slice is run.

Notes

Les exemples suivants concernent SQL Azure, mais sont applicables à tout autre magasin de données prenant en charge les jeux de données rectangulaires.The following samples are for Azure SQL but are applicable to any data store that supports rectangular datasets. Vous pouvez avoir besoin d’ajuster le type de source et la propriété de requête (par exemple : query au lieu de sqlReaderQuery) pour le magasin de données.You may have to adjust the type of source and the query property (for example: query instead of sqlReaderQuery) for the data store.

En général, vous souhaitez lire uniquement les données des magasins relationnels qui correspondent à cette tranche.Usually, when reading from relational stores, you want to read only the data corresponding to that slice. Pour cela, vous pouvez utiliser les variables système WindowStart et WindowEnd disponibles dans Azure Data Factory.A way to do so would be by using the WindowStart and WindowEnd system variables available in Azure Data Factory. Pour en savoir plus sur les variables et les fonctions dans Azure Data Factory, lisez l’article intitulé Azure Data Factory - Variables système et fonctions.Read about the variables and functions in Azure Data Factory here in the Azure Data Factory - Functions and System Variables article. Exemple :Example:

"source": {
    "type": "SqlSource",
    "sqlReaderQuery": "$$Text.Format('select * from MyTable where timestampcolumn >= \\'{0:yyyy-MM-dd HH:mm\\' AND timestampcolumn < \\'{1:yyyy-MM-dd HH:mm\\'', WindowStart, WindowEnd)"
},

Cette requête lit des données qui figurent dans la plage de durée de tranche (WindowStart -> WindowEnd) à partir de la table MyTable.This query reads data that falls in the slice duration range (WindowStart -> WindowEnd) from the table MyTable. Par ailleurs, la réexécution de cette tranche garantit toujours la lecture des mêmes données.Rerun of this slice would also always ensure that the same data is read.

Dans d’autres cas, vous souhaitez lire l’intégralité de la table. Vous pouvez alors définir sqlReaderQuery comme suit :In other cases, you may wish to read the entire table and may define the sqlReaderQuery as follows:

"source": 
{            
    "type": "SqlSource",
    "sqlReaderQuery": "select * from MyTable"
},

Écriture répétable dans SqlSinkRepeatable write to SqlSink

Lors de la copie de données vers SQL Azure/SQL Server à partir d’autres magasins de données, vous devez garder la répétabilité à l’esprit afin d’éviter des résultats inattendus.When copying data to Azure SQL/SQL Server from other data stores, you need to keep repeatability in mind to avoid unintended outcomes.

Lors de la copie de données sur une base de données Azure SQL/SQL Server, l’activité de copie ajoute des données à la table de récepteur par défaut.When copying data to Azure SQL/SQL Server Database, the copy activity appends data to the sink table by default. Par exemple, vous copiez des données à partir d’un fichier CSV (valeurs séparées par des virgules) contenant deux enregistrements et les collez dans la table suivante d’une base de données Azure SQL/SQL Server.Say, you are copying data from a CSV (comma-separated values) file containing two records to the following table in an Azure SQL/SQL Server Database. Lorsqu’une tranche est exécutée, les deux enregistrements sont copiés dans la table SQL.When a slice runs, the two records are copied to the SQL table.

ID    Product        Quantity    ModifiedDate
...    ...            ...            ...
6    Flat Washer    3            2015-05-01 00:00:00
7     Down Tube    2            2015-05-01 00:00:00

Supposons que vous trouviez des erreurs dans le fichier source et mettiez à jour la quantité de Down Tube, la faisant passer de 2 à 4.Suppose you found errors in source file and updated the quantity of Down Tube from 2 to 4. Si vous réexécutez manuellement la tranche de données pour cette période, vous trouvez deux nouveaux enregistrements ajoutés à la base de données SQL Azure/SQL Server.If you rerun the data slice for that period manually, you’ll find two new records appended to Azure SQL/SQL Server Database. Cet exemple suppose qu’aucune des colonnes de la table ne présente de contrainte de clé primaire.This example assumes that none of the columns in the table has the primary key constraint.

ID    Product        Quantity    ModifiedDate
...    ...            ...            ...
6    Flat Washer    3            2015-05-01 00:00:00
7     Down Tube    2            2015-05-01 00:00:00
6    Flat Washer    3            2015-05-01 00:00:00
7     Down Tube    4            2015-05-01 00:00:00

Pour éviter ce problème, vous devez spécifier la sémantique UPSERT en utilisant l’une des deux mécanismes suivants :To avoid this behavior, you need to specify UPSERT semantics by using one of the following two mechanisms:

Mécanisme 1 : utilisation de la propriété sqlWriterCleanupScriptMechanism 1: using sqlWriterCleanupScript

Vous pouvez utiliser la propriété sqlWriterCleanupScript pour nettoyer les données à partir de la table du récepteur avant d’insérer les données lors de l’exécution d’une tranche.You can use the sqlWriterCleanupScript property to clean up data from the sink table before inserting the data when a slice is run.

"sink":  
{ 
  "type": "SqlSink", 
  "sqlWriterCleanupScript": "$$Text.Format('DELETE FROM table WHERE ModifiedDate >= \\'{0:yyyy-MM-dd HH:mm}\\' AND ModifiedDate < \\'{1:yyyy-MM-dd HH:mm}\\'', WindowStart, WindowEnd)"
}

Lorsqu’une tranche s’exécute, le script de nettoyage est d’abord exécuté pour supprimer les données correspondant à la tranche dans la table SQL.When a slice runs, the cleanup script is run first to delete data that corresponds to the slice from the SQL table. Ensuite, l’activité de copie insère les données dans la table SQL.The copy activity then inserts data into the SQL Table. Si la tranche est réexécutée, la quantité est mise à jour comme vous le souhaitez.If the slice is rerun, the quantity is updated as desired.

ID    Product        Quantity    ModifiedDate
...    ...            ...            ...
6    Flat Washer    3            2015-05-01 00:00:00
7     Down Tube    4            2015-05-01 00:00:00

Supposons que l’enregistrement Flat Washer soit supprimé du fichier csv d’origine.Suppose the Flat Washer record is removed from the original csv. Une nouvelle exécution de la tranche entraînerait le résultat suivant :Then rerunning the slice would produce the following result:

ID    Product        Quantity    ModifiedDate
...    ...            ...            ...
7     Down Tube    4            2015-05-01 00:00:00

L’activité de copie a exécuté le script de nettoyage pour supprimer les données correspondant à cette tranche.The copy activity ran the cleanup script to delete the corresponding data for that slice. Elle a ensuite lu l’entrée du fichier csv (qui ne contenait qu’un enregistrement) avant de l’insérer dans la table.Then it read the input from the csv (which then contained only one record) and inserted it into the Table.

Mécanisme 2 : utilisation du paramètre sliceIdentifierColumnNameMechanism 2: using sliceIdentifierColumnName

Important

Pour le moment, le paramètre sliceIdentifierColumnName n’est pas pris en charge par Azure SQL Data Warehouse.Currently, sliceIdentifierColumnName is not supported for Azure SQL Data Warehouse.

Un deuxième mécanisme pour obtenir la répétabilité consiste à disposer d’une colonne dédiée (sliceIdentifierColumnName) dans la table cible.The second mechanism to achieve repeatability is by having a dedicated column (sliceIdentifierColumnName) in the target Table. Cette colonne peut être utilisée par Azure Data Factory pour s’assurer que la source et la destination restent synchronisées.This column would be used by Azure Data Factory to ensure the source and destination stay synchronized. Cette approche fonctionne s’il existe une flexibilité dans la modification ou la définition du schéma de table SQL de destination.This approach works when there is flexibility in changing or defining the destination SQL Table schema.

Cette colonne est utilisée par Azure Data Factory à des fins de répétabilité. Au cours du processus, Azure Data Factory n’apporte aucune modification de schéma à la table.This column is used by Azure Data Factory for repeatability purposes and in the process Azure Data Factory does not make any schema changes to the Table. Façon d’utiliser cette approche :Way to use this approach:

  1. Définissez une colonne de type binaire (32) dans la table SQL de destination.Define a column of type binary (32) in the destination SQL Table. Aucune contrainte ne doit exister sur cette colonne.There should be no constraints on this column. Pour les besoins de cet exemple, nommons cette colonne « AdfSliceIdentifier ».Let's name this column as AdfSliceIdentifier for this example.

    Table source :Source table:

    CREATE TABLE [dbo].[Student](
       [Id] [varchar](32) NOT NULL,
       [Name] [nvarchar](256) NOT NULL
    )
    

    Table de destination :Destination table:

    CREATE TABLE [dbo].[Student](
       [Id] [varchar](32) NOT NULL,
       [Name] [nvarchar](256) NOT NULL,
       [AdfSliceIdentifier] [binary](32) NULL
    )
    
  2. Utilisez-la dans l’activité de copie comme suit :Use it in the copy activity as follows:

    "sink":  
    { 
    
        "type": "SqlSink", 
        "sliceIdentifierColumnName": "AdfSliceIdentifier"
    }
    

Azure Data Factory renseigne cette colonne conformément à ses besoins pour s’assurer que la source et la destination restent synchronisées.Azure Data Factory populates this column as per its need to ensure the source and destination stay synchronized. Les valeurs de cette colonne ne doivent pas être utilisées en dehors de ce contexte.The values of this column should not be used outside of this context.

Comme pour le mécanisme 1, l’activité de copie nettoie automatiquement les données de la tranche spécifiée dans la table SQL de destination.Similar to mechanism 1, Copy Activity automatically cleans up the data for the given slice from the destination SQL Table. Ensuite, elle insère les données de la source dans la table de destination.It then inserts data from source in to the destination table.

Étapes suivantesNext steps

Pour accéder à des exemples JSON complets, consultez les articles suivants sur les connecteurs :Review the following connector articles that for complete JSON examples: