我目前正在将 blob 文件从 Azure Blob 存储复制到 Azure SQL 数据库。它计划每 15 分钟运行一次,但每次运行时都会重复导入所有 blob 文件。我宁愿对其进行配置,使其仅在任何新文件到达 Blob 存储时才导入。需要注意的一件事是文件没有日期时间戳。所有文件都存在于单个 blob 容器中。新文件将添加到同一个 blob 容器中。你知道如何配置这个吗?
3 回答
我会在这个答案的开头加上你的方法的改变可能是有道理的......
鉴于您所描述的您的选择相当有限。一种方法是让您的计划作业了解已存储到 SQL 数据库中的内容。您遍历容器中的所有项目并检查它是否已被处理。
该容器有一个可以为此工作的 ListBlobs 方法。参考: https ://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-blobs/
foreach (var item in container.ListBlobs(null, true))
{
// Check if it has already been processed or not
}
请注意,容器中的 blob 数量可能是这种方法的一个问题。如果它太大,请考虑每小时/每天/每周/等创建一个新容器来保存 blob,假设您可以控制它。
请使用 CloudBlobContainer。ListBlobs (null, true, BlobListingDetails .Metadata) 并检查 CloudBlob。属性。每个列出的 blob 的LastModified。
我将使用 Azure 数据工厂中的自定义 DotNet 活动,而不是复制活动,并使用 Blob 存储 API(此处的一些答案已经描述了此 API 的使用)和 Azure SQL API 来执行仅新文件的副本.
但是,随着时间的推移,您的 blob 位置将包含大量文件,因此,预计您的工作将开始花费越来越长的时间(在某个时间点超过 15 分钟之后),因为它每次都会遍历每个文件。
你能进一步解释你的情况吗?您是否有理由希望每 15 分钟向 SQL 表添加数据?您可以增加它以每小时复制数据吗?此外,这些数据是如何进入 Blob 存储的?是另一个 Azure 服务把它放在那里还是一个外部应用程序?如果它是另一项服务,请考虑将其直接移至 Azure SQL 并删除 Blob 存储。
另一个建议是为 15 分钟间隔创建文件夹,例如 hhmm。因此,例如,示例文件夹将被称为“0515”。您甚至可以为年、月和日创建一个父文件夹。这样,您可以将数据插入到 Blob 存储中的这些文件夹中。数据工厂能够读取日期和时间文件夹并识别进入日期/时间文件夹的新文件。
我希望这有帮助!如果您可以提供有关您的问题的更多信息,我很乐意为您提供进一步的帮助。