Bagikan melalui


Menghapus Aktivitas di Azure Data Factory dan Azure Synapse Analytics

BERLAKU UNTUK: Azure Data Factory Azure Synapse Analytics

Tip

Cobalah Data Factory di Microsoft Fabric, solusi analitik all-in-one untuk perusahaan. Microsoft Fabric mencakup semuanya mulai dari pergerakan data hingga ilmu data, analitik real time, kecerdasan bisnis, dan pelaporan. Pelajari cara memulai uji coba baru secara gratis!

Anda dapat menggunakan Aktivitas Hapus di Azure Data Factory untuk menghapus file atau folder dari penyimpanan lokal atau penyimpanan cloud. Gunakan aktivitas ini untuk membersihkan atau mengarsipkan file saat file tidak lagi diperlukan.

Peringatan

File atau folder yang dihapus tidak dapat dipulihkan (kecuali penyimpanan mengaktifkan penghapusan sementara). Berhati-hatilah saat menggunakan aktivitas Hapus untuk menghapus file atau folder.

Praktik terbaik

Berikut adalah beberapa rekomendasi untuk menggunakan aktivitas Hapus:

  • Cadangkan file Anda sebelum menghapusnya dengan aktivitas Hapus, untuk berjaga-jaga jika Anda perlu memulihkannya di masa mendatang.

  • Pastikan layanan memiliki izin tulis untuk menghapus folder atau file dari penyimpanan.

  • Pastikan Anda tidak menghapus file yang sedang ditulis secara bersamaan.

  • Jika Anda ingin menghapus file atau folder dari sistem lokal, pastikan Anda menggunakan runtime integrasi yang dihost sendiri dengan versi yang lebih besar dari 3.14.

Penyimpanan data yang didukung

Membuat aktivitas Hapus dengan UI

Untuk menggunakan aktivitas Hapus dalam alur, selesaikan langkah-langkah berikut:

  1. Telusuri Hapus di panel Aktivitas alur, dan seret aktivitas Hapus ke kanvas alur.

  2. Pilih aktivitas Hapus baru di kanvas jika belum dipilih, dan tab Sumbernya, untuk mengedit detailnya.

    Menampilkan UI untuk aktivitas Hapus.

  3. Pilih Himpunan data yang sudah ada atau buat Himpunan Data baru yang menentukan file yang akan dihapus. Jika beberapa file dipilih, secara opsional aktifkan penghapusan rekursif, yang juga menghapus data di folder turunan mana pun. Anda juga dapat menentukan jumlah maksimum koneksi bersamaan untuk operasi.

  4. Konfigurasikan pencatatan secara opsional dengan memilih tab Pengaturan pengelogan dan memilih lokasi layanan tertaut akun pengelogan baru untuk mencatat hasil operasi penghapusan yang dilakukan.

    Menampilkan   Pengaturan pengelogan  tab untuk aktivitas Hapus.

Sintaks

{
    "name": "DeleteActivity",
    "type": "Delete",
    "typeProperties": {
        "dataset": {
            "referenceName": "<dataset name>",
            "type": "DatasetReference"
        },
        "storeSettings": {
            "type": "<source type>",
            "recursive": true/false,
            "maxConcurrentConnections": <number>
        },
        "enableLogging": true/false,
        "logStorageSettings": {
            "linkedServiceName": {
                "referenceName": "<name of linked service>",
                "type": "LinkedServiceReference"
            },
            "path": "<path to save log file>"
        }
    }
}

Properti jenis

Properti Deskripsi Wajib diisi
himpunan data Menyediakan referensi himpunan data untuk menentukan file atau folder mana yang akan dihapus Ya
recursive Menunjukkan apakah file dihapus secara rekursif dari subfolder atau hanya dari folder tertentu. Tidak. Default adalah false.
maxConcurrentConnections Jumlah koneksi yang akan disambungkan ke penyimpanan secara bersamaan untuk menghapus folder atau file. Tidak. Default adalah 1.
aktifkan pengelogan Menunjukkan apakah Anda perlu merekam folder atau nama file yang dihapus. Jika diatur ke true, Anda perlu menyediakan akun penyimpanan lebih lanjut untuk menyimpan file log, sehingga Anda dapat melacak perilaku aktivitas Hapus dengan membaca file log. No
logStorageSettings Hanya berlaku saat enablelogging = true.

Sekelompok properti penyimpanan yang dapat ditentukan di mana Anda ingin menyimpan file log yang berisi folder atau nama file yang dihapus oleh aktivitas Hapus.
No
linkedServiceName Hanya berlaku saat enablelogging = true.

Layanan tertaut Azure Storage, Azure Data Lake Storage Gen1, atau Azure Data Lake Storage Gen2 untuk menyimpan file log yang berisi folder atau nama file yang dihapus oleh aktivitas Hapus. Ketahuilah bahwa itu harus dikonfigurasi dengan jenis Integration Runtime yang sama dari yang digunakan oleh aktivitas hapus untuk menghapus file.
No
jalan Hanya berlaku saat enablelogging = true.

Jalur untuk menyimpan file log di akun penyimpanan Anda. Jika Anda tidak menyediakan jalur, layanan akan membuat kontainer untuk Anda.
No

Pemantauan

Ada dua tempat di mana Anda dapat melihat dan memantau hasil aktivitas Hapus:

  • Dari output aktivitas Hapus.
  • Dari file log.

Sampel output aktivitas Hapus

{ 
  "datasetName": "AmazonS3",
  "type": "AmazonS3Object",
  "prefix": "test",
  "bucketName": "adf",
  "recursive": true,
  "isWildcardUsed": false,
  "maxConcurrentConnections": 2,  
  "filesDeleted": 4,
  "logPath": "https://sample.blob.core.windows.net/mycontainer/5c698705-a6e2-40bf-911e-e0a927de3f07",
  "effectiveIntegrationRuntime": "MyAzureIR (West Central US)",
  "executionDuration": 650
}

Sampel file log aktivitas Hapus

Nama Kategori Status Kesalahan
test1/yyy.json File Dihapus
test2/hello789.txt File Dihapus
test2/test3/hello000.txt File Dihapus
test2/test3/zzz.json File Dihapus

Contoh penggunaan aktivitas Hapus

Menghapus folder atau file tertentu

Penyimpanan memiliki struktur folder berikut ini:

Root/
    Folder_A_1/
        1.txt
        2.txt
        3.csv
    Folder_A_2/
        4.txt
        5.csv
        Folder_B_1/
            6.txt
            7.csv
        Folder_B_2/
            8.txt

Sekarang Anda menggunakan aktivitas Hapus untuk menghapus folder atau file dengan kombinasi nilai properti yang berbeda dari himpunan data dan aktivitas Hapus:

folderPath fileName recursive Output
Root/ Folder_A_2 NULL Salah Root/
    Folder_A_1/
        1.txt
        2.txt
        3.csv
    Folder_A_2/
        4.txt
        5.csv
        Folder_B_1/
            6.txt
            7.csv
        Folder_B_2/
            8.txt
Root/ Folder_A_2 NULL Benar Root/
    Folder_A_1/
        1.txt
        2.txt
        3.csv
    Folder_A_2/
        4.txt
        5.csv
        Folder_B_1/
            6.txt
            7.csv
        Folder_B_2/
            8.txt
Root/ Folder_A_2 *.txt Salah Root/
    Folder_A_1/
        1.txt
        2.txt
        3.csv
    Folder_A_2/
        4.txt
        5.csv
        Folder_B_1/
            6.txt
            7.csv
        Folder_B_2/
            8.txt
Root/ Folder_A_2 *.txt Benar Root/
    Folder_A_1/
        1.txt
        2.txt
        3.csv
    Folder_A_2/
        4.txt
        5.csv
        Folder_B_1/
            6.txt
            7.csv
        Folder_B_2/
            8.txt

Membersihkan folder atau file yang dipartisi waktu secara berkala

Anda dapat membuat alur untuk membersihkan folder atau file yang dipartisi secara berkala. Misalnya, struktur folder mirip dengan: /mycontainer/2018/12/14/*.csv. Anda dapat menggunakan variabel sistem layanan dari pemicu jadwal untuk mengidentifikasi folder atau file mana yang harus dihapus di setiap eksekusi alur.

Alur sampel

{
    "name":"cleanup_time_partitioned_folder",
    "properties":{
        "activities":[
            {
                "name":"DeleteOneFolder",
                "type":"Delete",
                "dependsOn":[

                ],
                "policy":{
                    "timeout":"7.00:00:00",
                    "retry":0,
                    "retryIntervalInSeconds":30,
                    "secureOutput":false,
                    "secureInput":false
                },
                "userProperties":[

                ],
                "typeProperties":{
                    "dataset":{
                        "referenceName":"PartitionedFolder",
                        "type":"DatasetReference",
                        "parameters":{
                            "TriggerTime":{
                                "value":"@formatDateTime(pipeline().parameters.TriggerTime, 'yyyy/MM/dd')",
                                "type":"Expression"
                            }
                        }
                    },
                    "logStorageSettings":{
                        "linkedServiceName":{
                            "referenceName":"BloblinkedService",
                            "type":"LinkedServiceReference"
                        },
                        "path":"mycontainer/log"
                    },
                    "enableLogging":true,
                    "storeSettings":{
                        "type":"AzureBlobStorageReadSettings",
                        "recursive":true
                    }
                }
            }
        ],
        "parameters":{
            "TriggerTime":{
                "type":"string"
            }
        },
        "annotations":[

        ]
    }
}

Sampel himpunan data

{
    "name":"PartitionedFolder",
    "properties":{
        "linkedServiceName":{
            "referenceName":"BloblinkedService",
            "type":"LinkedServiceReference"
        },
        "parameters":{
            "TriggerTime":{
                "type":"string"
            }
        },
        "annotations":[

        ],
        "type":"Binary",
        "typeProperties":{
            "location":{
                "type":"AzureBlobStorageLocation",
                "folderPath":{
                    "value":"@dataset().TriggerTime",
                    "type":"Expression"
                },
                "container":{
                    "value":"mycontainer",
                    "type":"Expression"
                }
            }
        }
    }
}

Pemicu sampel

{
    "name": "DailyTrigger",
    "properties": {
        "runtimeState": "Started",
        "pipelines": [
            {
                "pipelineReference": {
                    "referenceName": "cleanup_time_partitioned_folder",
                    "type": "PipelineReference"
                },
                "parameters": {
                    "TriggerTime": "@trigger().scheduledTime"
                }
            }
        ],
        "type": "ScheduleTrigger",
        "typeProperties": {
            "recurrence": {
                "frequency": "Day",
                "interval": 1,
                "startTime": "2018-12-13T00:00:00.000Z",
                "timeZone": "UTC",
                "schedule": {
                    "minutes": [
                        59
                    ],
                    "hours": [
                        23
                    ]
                }
            }
        }
    }
}

Bersihkan file kedaluwarsa yang terakhir dimodifikasi sebelum 2018.1.1

Anda dapat membuat alur untuk membersihkan file lama atau kedaluwarsa dengan menggunakan filter atribut file: "LastModified" dalam himpunan data.

Alur sampel

{
    "name":"CleanupExpiredFiles",
    "properties":{
        "activities":[
            {
                "name":"DeleteFilebyLastModified",
                "type":"Delete",
                "dependsOn":[

                ],
                "policy":{
                    "timeout":"7.00:00:00",
                    "retry":0,
                    "retryIntervalInSeconds":30,
                    "secureOutput":false,
                    "secureInput":false
                },
                "userProperties":[

                ],
                "typeProperties":{
                    "dataset":{
                        "referenceName":"BlobFilesLastModifiedBefore201811",
                        "type":"DatasetReference"
                    },
                    "logStorageSettings":{
                        "linkedServiceName":{
                            "referenceName":"BloblinkedService",
                            "type":"LinkedServiceReference"
                        },
                        "path":"mycontainer/log"
                    },
                    "enableLogging":true,
                    "storeSettings":{
                        "type":"AzureBlobStorageReadSettings",
                        "recursive":true,
                        "modifiedDatetimeEnd":"2018-01-01T00:00:00.000Z"
                    }
                }
            }
        ],
        "annotations":[

        ]
    }
}

Sampel himpunan data

{
    "name":"BlobFilesLastModifiedBefore201811",
    "properties":{
        "linkedServiceName":{
            "referenceName":"BloblinkedService",
            "type":"LinkedServiceReference"
        },
        "annotations":[

        ],
        "type":"Binary",
        "typeProperties":{
            "location":{
                "type":"AzureBlobStorageLocation",
                "fileName":"*",
                "folderPath":"mydirectory",
                "container":"mycontainer"
            }
        }
    }
}

Memindahkan file dengan merantai aktivitas Salin dan aktivitas Hapus

Anda dapat memindahkan file dengan menggunakan aktivitas Salin untuk menyalin file lalu aktivitas Hapus untuk menghapus file dalam alur. Saat Anda ingin memindahkan beberapa file, Anda dapat menggunakan aktivitas GetMetadata + aktivitas Filter + aktivitas Foreach + aktivitas Salin + aktivitas Hapus seperti dalam sampel berikut.

Catatan

Jika Anda ingin memindahkan seluruh folder dengan menentukan himpunan data yang hanya berisi jalur folder, lalu menggunakan aktivitas Salin dan aktivitas Hapus untuk merujuk ke himpunan data yang sama yang mewakili folder, Anda harus sangat berhati-hati. Anda harus memastikan bahwa tidak akan ada file baru yang masuk ke folder antara operasi salin dan operasi hapus. Jika file baru masuk di folder saat aktivitas salin Anda baru saja menyelesaikan pekerjaan penyalinan tetapi aktivitas Hapus belum dimulai, aktivitas Hapus mungkin akan menghapus file yang baru masuk ini yang BELUM disalin ke tujuan dengan menghapus seluruh folder.

Alur sampel

{
    "name":"MoveFiles",
    "properties":{
        "activities":[
            {
                "name":"GetFileList",
                "type":"GetMetadata",
                "dependsOn":[

                ],
                "policy":{
                    "timeout":"7.00:00:00",
                    "retry":0,
                    "retryIntervalInSeconds":30,
                    "secureOutput":false,
                    "secureInput":false
                },
                "userProperties":[

                ],
                "typeProperties":{
                    "dataset":{
                        "referenceName":"OneSourceFolder",
                        "type":"DatasetReference",
                        "parameters":{
                            "Container":{
                                "value":"@pipeline().parameters.SourceStore_Location",
                                "type":"Expression"
                            },
                            "Directory":{
                                "value":"@pipeline().parameters.SourceStore_Directory",
                                "type":"Expression"
                            }
                        }
                    },
                    "fieldList":[
                        "childItems"
                    ],
                    "storeSettings":{
                        "type":"AzureBlobStorageReadSettings",
                        "recursive":true
                    },
                    "formatSettings":{
                        "type":"BinaryReadSettings"
                    }
                }
            },
            {
                "name":"FilterFiles",
                "type":"Filter",
                "dependsOn":[
                    {
                        "activity":"GetFileList",
                        "dependencyConditions":[
                            "Succeeded"
                        ]
                    }
                ],
                "userProperties":[

                ],
                "typeProperties":{
                    "items":{
                        "value":"@activity('GetFileList').output.childItems",
                        "type":"Expression"
                    },
                    "condition":{
                        "value":"@equals(item().type, 'File')",
                        "type":"Expression"
                    }
                }
            },
            {
                "name":"ForEachFile",
                "type":"ForEach",
                "dependsOn":[
                    {
                        "activity":"FilterFiles",
                        "dependencyConditions":[
                            "Succeeded"
                        ]
                    }
                ],
                "userProperties":[

                ],
                "typeProperties":{
                    "items":{
                        "value":"@activity('FilterFiles').output.value",
                        "type":"Expression"
                    },
                    "batchCount":20,
                    "activities":[
                        {
                            "name":"CopyAFile",
                            "type":"Copy",
                            "dependsOn":[

                            ],
                            "policy":{
                                "timeout":"7.00:00:00",
                                "retry":0,
                                "retryIntervalInSeconds":30,
                                "secureOutput":false,
                                "secureInput":false
                            },
                            "userProperties":[

                            ],
                            "typeProperties":{
                                "source":{
                                    "type":"BinarySource",
                                    "storeSettings":{
                                        "type":"AzureBlobStorageReadSettings",
                                        "recursive":false,
                                        "deleteFilesAfterCompletion":false
                                    },
                                    "formatSettings":{
                                        "type":"BinaryReadSettings"
                                    },
                                    "recursive":false
                                },
                                "sink":{
                                    "type":"BinarySink",
                                    "storeSettings":{
                                        "type":"AzureBlobStorageWriteSettings"
                                    }
                                },
                                "enableStaging":false,
                                "dataIntegrationUnits":0
                            },
                            "inputs":[
                                {
                                    "referenceName":"OneSourceFile",
                                    "type":"DatasetReference",
                                    "parameters":{
                                        "Container":{
                                            "value":"@pipeline().parameters.SourceStore_Location",
                                            "type":"Expression"
                                        },
                                        "Directory":{
                                            "value":"@pipeline().parameters.SourceStore_Directory",
                                            "type":"Expression"
                                        },
                                        "filename":{
                                            "value":"@item().name",
                                            "type":"Expression"
                                        }
                                    }
                                }
                            ],
                            "outputs":[
                                {
                                    "referenceName":"OneDestinationFile",
                                    "type":"DatasetReference",
                                    "parameters":{
                                        "Container":{
                                            "value":"@pipeline().parameters.DestinationStore_Location",
                                            "type":"Expression"
                                        },
                                        "Directory":{
                                            "value":"@pipeline().parameters.DestinationStore_Directory",
                                            "type":"Expression"
                                        },
                                        "filename":{
                                            "value":"@item().name",
                                            "type":"Expression"
                                        }
                                    }
                                }
                            ]
                        },
                        {
                            "name":"DeleteAFile",
                            "type":"Delete",
                            "dependsOn":[
                                {
                                    "activity":"CopyAFile",
                                    "dependencyConditions":[
                                        "Succeeded"
                                    ]
                                }
                            ],
                            "policy":{
                                "timeout":"7.00:00:00",
                                "retry":0,
                                "retryIntervalInSeconds":30,
                                "secureOutput":false,
                                "secureInput":false
                            },
                            "userProperties":[

                            ],
                            "typeProperties":{
                                "dataset":{
                                    "referenceName":"OneSourceFile",
                                    "type":"DatasetReference",
                                    "parameters":{
                                        "Container":{
                                            "value":"@pipeline().parameters.SourceStore_Location",
                                            "type":"Expression"
                                        },
                                        "Directory":{
                                            "value":"@pipeline().parameters.SourceStore_Directory",
                                            "type":"Expression"
                                        },
                                        "filename":{
                                            "value":"@item().name",
                                            "type":"Expression"
                                        }
                                    }
                                },
                                "logStorageSettings":{
                                    "linkedServiceName":{
                                        "referenceName":"BloblinkedService",
                                        "type":"LinkedServiceReference"
                                    },
                                    "path":"container/log"
                                },
                                "enableLogging":true,
                                "storeSettings":{
                                    "type":"AzureBlobStorageReadSettings",
                                    "recursive":true
                                }
                            }
                        }
                    ]
                }
            }
        ],
        "parameters":{
            "SourceStore_Location":{
                "type":"String"
            },
            "SourceStore_Directory":{
                "type":"String"
            },
            "DestinationStore_Location":{
                "type":"String"
            },
            "DestinationStore_Directory":{
                "type":"String"
            }
        },
        "annotations":[

        ]
    }
}

Sampel himpunan data

Himpunan data yang digunakan oleh aktivitas GetMetadata untuk menghitung daftar file.

{
    "name":"OneSourceFolder",
    "properties":{
        "linkedServiceName":{
            "referenceName":"AzureStorageLinkedService",
            "type":"LinkedServiceReference"
        },
        "parameters":{
            "Container":{
                "type":"String"
            },
            "Directory":{
                "type":"String"
            }
        },
        "annotations":[

        ],
        "type":"Binary",
        "typeProperties":{
            "location":{
                "type":"AzureBlobStorageLocation",
                "folderPath":{
                    "value":"@{dataset().Directory}",
                    "type":"Expression"
                },
                "container":{
                    "value":"@{dataset().Container}",
                    "type":"Expression"
                }
            }
        }
    }
}

Himpunan data untuk sumber data yang digunakan oleh aktivitas salin dan aktivitas Hapus.

{
    "name":"OneSourceFile",
    "properties":{
        "linkedServiceName":{
            "referenceName":"AzureStorageLinkedService",
            "type":"LinkedServiceReference"
        },
        "parameters":{
            "Container":{
                "type":"String"
            },
            "Directory":{
                "type":"String"
            },
            "filename":{
                "type":"string"
            }
        },
        "annotations":[

        ],
        "type":"Binary",
        "typeProperties":{
            "location":{
                "type":"AzureBlobStorageLocation",
                "fileName":{
                    "value":"@dataset().filename",
                    "type":"Expression"
                },
                "folderPath":{
                    "value":"@{dataset().Directory}",
                    "type":"Expression"
                },
                "container":{
                    "value":"@{dataset().Container}",
                    "type":"Expression"
                }
            }
        }
    }
}

Himpunan data untuk tujuan data yang digunakan oleh aktivitas salin.

{
    "name":"OneDestinationFile",
    "properties":{
        "linkedServiceName":{
            "referenceName":"AzureStorageLinkedService",
            "type":"LinkedServiceReference"
        },
        "parameters":{
            "Container":{
                "type":"String"
            },
            "Directory":{
                "type":"String"
            },
            "filename":{
                "type":"string"
            }
        },
        "annotations":[

        ],
        "type":"Binary",
        "typeProperties":{
            "location":{
                "type":"AzureBlobStorageLocation",
                "fileName":{
                    "value":"@dataset().filename",
                    "type":"Expression"
                },
                "folderPath":{
                    "value":"@{dataset().Directory}",
                    "type":"Expression"
                },
                "container":{
                    "value":"@{dataset().Container}",
                    "type":"Expression"
                }
            }
        }
    }
}

Anda juga bisa mendapatkan templat untuk memindahkan file dari sini.

Pembatasan yang diketahui

  • Aktivitas penghapusan tidak mendukung penghapusan daftar folder yang dijelaskan oleh kartubebas.

  • Saat menggunakan filter atribut file dalam aktivitas hapus: modifiedDatetimeStart dan modifiedDatetimeEnd untuk memilih file yang akan dihapus, pastikan untuk mengatur "wildcardFileName": "*" dalam aktivitas hapus juga.

Pelajari selengkapnya tentang memindahkan file di Azure Data Factory dan alur Synapse.