Azure Data Factory: How to copy specific files based on file's create date? - azure

I failed for below test case:
Create new folderA on SourceContainer and insert fileA
Trigger Pipelines to copy it to TargetContainer successfully
Delete folderA/fileA from TargetContainer
Trigger Pipelines with specific start and end time (try to not copy all folders/files again)
Cannot see folderA/fileA on TargetContainer

Within Copy activity, source features: you can mention the range of the date of the files which you need to copy:
And w.r.t trigger a pipeline when file is created, you can use Event trigger to achieve that.

Related

Azure Synapse Analytics - deleting pipeline Folder

I am new to Synapse and I have to make a pipeline that will delete files from folders in a hierarchy like the attached image. expecting hierarchy. The red half circles mark the files I would like to delete files for example older than 2 months.
As for now I have made a pipline for a single folder and using the for each loop I can get to the files and delete the corresponding one. And it works, since I have about 60-70 folders and even more files I wanted to go a level higher up and make a pipeline for each folder to execute. And with this is a problem. When i use GetMetadata Activity for top folder, and use for each loop to take name folders then i can not acess files in folder just only folder. Could you help me someone how to slove this?
deleting pipline for single folder using for each loop
We can achieve this using nested for each activities with the help of execute pipeline activity. As mentioned, Get metadata with wildcards returns all files without folders and Delete activity is unable to recognize wildcard folder paths(Folder/*).
I have created a similar folder structure for demo. In my pipeline, I have first created an array parameter req_files (sample1.csv and sample2.csv) with names of files required.
Note: If you want to dynamically do this, you can use append variable to build required file names (file09/22 and file08/22).
I used one get metadata to get folder names (which are inside root folder). I am iterating through the output of get metadata in my for each activity (items value is #activity('root folder contents').output.childItems).
Inside my for each, I used another get metadata activity to loop through each of the sub folders (to get file contents).
Now I have the folder name and list of files inside it. I am going to use execute pipeline to implement nested for each. Create 3 parameters in a new pipeline called delete_pipeline (where I perform delete) as current_folder, folder_files and files_needed.
Pass the following dynamic content for each of them from parent pipeline.
current_folder: #item().name
folder_files: #activity('sub folder contents').output.childItems
files_needed: #pipeline().parameters.req_files
Now in delete_pipeline, I have a for each loop to loop through the list of files we are passing (items value is #pipeline().parameters.folder_files).
Inside this for each, I am using an If condition activity. This is because I want to delete files which are not in my req_files parameter (array from parent pipeline which we passed to files_needed parameter in delete_pipeline). The condition for if condition activity will be as following:
#contains(pipeline().parameters.files_needed,item().name)
We need to delete the file only when it is not present in req_files (files_needed). So, when the condition is false, we perform delete.
I have created 2 parameters file_namepath_of_file_to_delete and file_name_to_delete in the dataset I am using for delete activity with following dynamic content.
file_namepath_of_file_to_delete: Folder/#{pipeline().parameters.current_folder}
file_name_to_delete: #item().name
When I run the pipeline, it keeps the required files and deletes the rest. The following are output images for reference.
Debug output: https://i.imgur.com/E6GNVHW.png
My folder after I run the pipeline: https://i.imgur.com/bqN00Dw.png

How to ignore files with invalid schema Azure Data Factory?

I am new to Azure Data Factory. Currently, I am trying to copy some data from files in blob storage to Azure Data Explorer.
The pipeline reads multiple files from a specific cosmos root directory and copies the data to ADE. Currently, the pipeline successfully handles the copy activities. I now want to add a validation component so that the pipeline only reads files with the correct schema and ignores the rest of the files.
The schema is as follows: Name, Type, Value, Date.
The pipeline itself should not fail/stop if the files are of invalid type or schema, it should just skip them and continue on with the rest of the files.
What component can I use for this validation?
Thanks!
You can use ForEach activity to achieve this requirement. The ForEach activity (in this case) can be used to copy each source file into destination. In case the schema don't match, the copy activity usually fails.
But when a copy activity inside foreach fails, the pipeline execution does not fail/stop. It throws an error for that particular copy activity that fails, but it continues the execution of copy activity for remaining files.
Look at the following demonstration for clear understanding.
The following are the files I am using for sample. The file sample_3.csv does not match the schema of my destination table.
I used Get Metadata activity to get files names of the above files using child items field list. I passed these values to ForEach as #activity('Get Metadata1').output.childItems.
Inside Foreach, I have a copy activity along with wait activity (wait executes only if copy activity fails)
When I execute this pipeline, it completes successfully without any errors. The following is the debug output.
The third iteration of copy activity fails as sample_3.csv has incorrect schema. And yet the pipeline runs successfully without failing.
UPDATE:
Mapping need not be specified in copy activity.

ADF Copy Pipeline not reading/writing all rows

I have a simple copy pipeline that reads from a CSV file and writes to a Azure SQL database. The pipeline finishes with no errors. On inspection, however, I can see that only 107,506 of the 129,601 rows are actually being read/written. The giveaway that this was not working is that the last row written to the table was not written completely.
The format of the file looks to be intact and formatted correctly. What is causing this issue (timeout issue?), and what options do I have to detect this in the future?
**** EDIT
It appears the issue is further up my pipeline. I am using a Logic App to check for new CSV files on an FTP site and then copy these files to Azure Blob Storage. On two occasions, the write of the logic app has cut off the file at 10 MB. This appears to be new as prior to 5/1 I was often exceeding 10MB. Is this in Azure change?
Check settings in copy activity . I suspect skip incompatible rows is selected in Fault tolerance option.

copy specific files from a container using wildcard filename in ADF pipeline

I'm trying to copy specific files from a container in a Storage Account using an ADF pipeline. lets say the container has the following files
aa_aaa_01_yyyymmdd.csv
aa_abb_01_yyyymmdd.csv
aa_aaa_02_yyyymmdd.csv
aa_aaa_03_yyyymmdd.csv
aa_abb_02_yyyymmdd.csv
ab_abc_01_yyyymmdd.csv
My pipeline has to copy all the files beginning with 'aa_aaa_'. I tried using the * wildcard at the time of creating the source dataset - like "aa_aaa_*.csv" but didn't work; the validation fails.
please help. Thanks
You can use prefix option like below in copy activity

Azure Data Factory - Event Triggers on Files In Multiple Folders

We are invoking ADF pipeline based on event based trigger.
Is there a way to trigger this pipeline only when a file arrives in both of these child folders
e.g
ParentFolder
-- ChildFolder1
-- ChildFolder2
Now we would like to trigger our pipelines only if a new file arrives in both of these folders.i.e ChildFolder1 and ChildFolder2
There is no out of box approach this. I can think of the below alternatives.
First Approach
You can set a trigger at the ChildFolder2
You can use a 'lookup activity' or 'Get Metadata Activity' which fetches the file with the name in the ChildFolder1 - See whether the file is created at the ChildFolder1.
If you would like to check after some time - delay it say for 10- 15 minutes. You could make use of the Wait activity
Now, if the file is existent - then you could continue with the rest of the execution of the pipeline. If the file is not created in Childfolder1 - then you could end the pipeline with no activity carried out.
The pipeline will eventually be triggered when the file is created in childfolder2. The Execution flow changes based on an If activity and existence of the file in the childfolder1.
Second Approach
If you don't have filename - and would like to get a file dynamically time created.
In the same way as above - you could set a Event trigger at the childfolder2.
In the pipeline execution you filter the files based out of the timestamp of the file pipeline start. This is slightly tricky.
You do a GetMetada for the childfolder1 and filter it using the foreach and if condition. (get the latest added file in a folder [Azure Data Factory])
If there is any file then execute the pipeline with rest of the activities else you could end the pipeline execution.

Resources