Azure Data Factory – kopiowanie nowych brakujących plików z jednego folderu do drugiego

Dziś bardziej zaawansowane zadanie. Naszym zadaniem jest utworzenie pipeline który będzie kopiował z folderu 1 do folderu 2 tylko te pliki, które nie występują jeszcze w folderze 2.

Zadanie to możemy zrealizować następujący sposób:

Pobieramy informacje o plikach w folderze 1 (źródłowym) i folderze 2 (docelowym), następnie filtrujemy takie pliki z folderu 1, które nie występują w folderze 2 i dla każdego takiego znalezionego pliku tworzymy operację copy data.

Zadanie to zrealizuje następujący pipeline:

Zaczynając od początku, tworzymy najpierw dataset dla folderu 1:

Zaznaczamy tu oczywiście cały folder, nie konkretny plik

Oraz dataset folderu docelowego, także wskazując cały folder

Możem teraz utworzyć pipeline. Wybieramy akcję Get Metadata Source i wybieramy argument child items – pobierze informacje wtedy o plikach w tym folderze

Output tej operacji, jak niemal wszystkich akcji jest w formacie JSON:

{
„childItems”: [
{
„name”: „sales_2021.csv”,
„type”: „File”
},
{
„name”: „sales_2022.csv”,
„type”: „File”
},
{
„name”: „sales_2023.csv”,
„type”: „File”
}
],
„effectiveIntegrationRuntime”: „AutoResolveIntegrationRuntime (Poland Central)”,
„executionDuration”: 0,
„durationInQueue”: {
„integrationRuntimeQueue”: 1
},
„billingReference”: {
„activityType”: „PipelineActivity”,
„billableDuration”: [
{
„meterType”: „AzureIR”,
„duration”: 0.016666666666666666,
„unit”: „Hours”
}
]
}
}

Informacja jak wygląda output przyda nam się w kolejnych krokach.

Tworzymy teraz podobną akcję dla folderu docelowego:

Teraz przed nami najważniejsza operacja – Filter

Jako Items wpisujemy co ma być filtrowane. Filtrujemy output z Get Metadata Source – wybieramy add dynamic content i @activity(’Get Metadata Source’).output.childItems

Condition to warunek filtrowania. Powinien wyglądać następująco:

Tzn. zaprzeczenie tego, że item(), czyli to co zaznaczyliśmy w zakładce Items zawiera się w outpucie z get metadata z folderu docelowego.

Outputem z akcji Filter jest:

{
„ItemsCount”: 3,
„FilteredItemsCount”: 2,
„Value”: [
{
„name”: „sales_2022.csv”,
„type”: „File”
},
{
„name”: „sales_2023.csv”,
„type”: „File”
}
]
}

Następnie tworzymy blok ForEach, jako output interesuje nas value z JSONa

W nim tworzymy akcję copy data

Jako Source możemy wykorzystać utworzony wcześniej dataset z folderu źródłowego. Jednak musimy dodać nazwę pliku – add dynamic content i wpisać @item.name.

@item.name to inaczej @activity(’Filter1′).output.value.name

W Sink musimy utworzyć parametr, który będzie wskazywał na nazwę pliku. Nie znamy przecież nazwy pliku docelowego – musimy odwołać się do outputu z akcji Filter. Utworzyliśmy też nowy dataset z parametrem:

Gotowe. Pliki zostaną przeniesione.