将 CSV 从 Azure blob 加载到 Azure SQL 的 SSIS 步骤

2024-01-06

我需要连接到 Azure blob(源)中的 CSV 文件,然后将数据加载到 Azure SQL Server 表中,然后将 CSV 文件移动到不同的(存档)Azure blob。

如果没有 Azure,我将创建一个到本地文件的平面文件连接,然后创建一个Data Flow task使用 Source Assistant 和 Destination Assistant 将数据加载到 SQL Server 表中,然后File System task in Control Flow将文件移至 Archive 目录。

我想做类似的事情,直接连接到 Azure Blob 中的文件,然后在数据流任务之后,将文件从一个 Azure Blob(源)移动到另一个 Azure Blob(存档)。

我能想到的最好的办法就是使用Azure Blob Download task将 CSV 移动到运行 SSIS 的 Azure VM(顺便问一下,您可以在没有 VM 的情况下获得 Azure SSIS 服务吗?),然后在下载后创建一个flat file connection & Data Flow加载数据,然后执行Azure Blob Upload task到存档 Blob。

似乎应该有一种方法可以连接到源 Azure blob 文件并直接从中读取,而无需先下载它。同样,似乎应该有一种方法可以在 Azure blob 容器之间移动文件。我能想到的最好的方法是下载/上传选项,但这需要中间位置(本地目录),并且下载后不会删除源文件。是否有 SSIS Azure 工具来执行这些任务?


对于问题的另一半有什么想法吗:在处理文件后将文件从源 blob 移动到存档 blob?

据我所知,没有任何内置任务可以帮助您实现此目的。根据我的测试,我认为您可以利用脚本任务 https://learn.microsoft.com/en-us/sql/integration-services/extending-packages-scripting/task/configuring-the-script-task-in-the-script-task-editor并编写代码(VB 或 C#)来直接处理 blob。下面是我的详细步骤,大家可以参考一下:

1) Use Azure Blob 源 https://learn.microsoft.com/en-us/sql/integration-services/data-flow/azure-blob-source and OLE DB 目标 https://learn.microsoft.com/en-us/sql/integration-services/lesson-1-7-adding-and-configuring-the-ole-db-destination under 数据流用于将 CSV 文件从 Azure Blob 加载到 Azure SQL 数据库中。

2) 成功将 CSV 数据加载到 SQL 表中后,使用脚本任务将源 blob 移动到存档 blob。

我将调用 Blob 服务 REST API复制斑点 https://learn.microsoft.com/en-us/rest/api/storageservices/fileservices/copy-blob and 删除斑点 https://learn.microsoft.com/en-us/rest/api/storageservices/fileservices/delete-blob with 容器 SAS 令牌 https://learn.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-signature-part-2,你可以利用微软Azure存储资源管理器 http://storageexplorer.com/并关注这位官方tutorial https://learn.microsoft.com/en-us/azure/vs-azure-tools-storage-explorer-blobs#get-the-sas-for-a-blob-container为 Blob 容器生成 SAS 令牌。

假设源 blob 和目标 blob 位于同一容器下,那么我添加三个变量(SourceBlobUrl,ContainerSasToken,ArchiveBlobUrl) 如下并将它们添加为 ReadOnlyVariables脚本任务编辑器,你可以参考这个tutorial https://learn.microsoft.com/en-us/sql/integration-services/extending-packages-scripting/task/using-variables-in-the-script-task用于在脚本任务中使用变量。

Click 编辑脚本脚本任务编辑器下的按钮启动 VSTA 开发环境,您可以在其中编写自定义脚本。这是下面的Main方法ScriptMain.cs如下:

public async void Main()
{
    // TODO: Add your code here
    string sasToken = Dts.Variables["ContainerSasToken"].Value.ToString();
    string sourceBlobUrl = Dts.Variables["SourceBlobUrl"].Value.ToString();
    string archiveBlobUrl = Dts.Variables["ArchiveBlobUrl"].Value.ToString();

    try
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add("x-ms-copy-source", sourceBlobUrl + sasToken);
        //copy source blob to archive blob
        Dts.Log($"start copying blob from [{sourceBlobUrl}] to [{archiveBlobUrl}]...", 0, new byte[0]);
        HttpResponseMessage response = await client.PutAsync(archiveBlobUrl + sasToken, null);
        if (response.StatusCode == HttpStatusCode.Accepted || response.StatusCode == HttpStatusCode.Created)
        {
            client.DefaultRequestHeaders.Clear();
            Dts.Log($"start deleting blob [{sourceBlobUrl}]...", 0, new byte[0]);
            //delete source blob
            HttpResponseMessage result = await client.DeleteAsync(sourceBlobUrl + sasToken);
            if (result.StatusCode == HttpStatusCode.Accepted || result.StatusCode == HttpStatusCode.Created)
            {
                Dts.TaskResult = (int)ScriptResults.Success;
                return;
            }
        }
        Dts.TaskResult = (int)ScriptResults.Failure;
    }
    catch (Exception ex)
    {
        Dts.Events.FireError(-1, "Script Task - Move source blob to an archive blob", ex.Message + "\r" + ex.StackTrace, String.Empty, 0);
        Dts.TaskResult = (int)ScriptResults.Failure;
    }
}

Result

此外,您还可以利用适用于 .NET 的 Microsoft Azure 存储客户端库 https://learn.microsoft.com/en-us/azure/storage/storage-dotnet-how-to-use-blobs要访问存储blob,此时需要在GAC之外的SSIS脚本任务中加载程序集,更多详细信息可以参考官方的这篇文章blog https://blogs.msdn.microsoft.com/dbrowne/2014/06/25/how-to-load-an-assembly-in-a-ssis-script-task-that-isnt-in-the-gac/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 CSV 从 Azure blob 加载到 Azure SQL 的 SSIS 步骤 的相关文章

  • 如何将 WebJob 集成到 Azure 数据工厂管道中

    我正在尝试将 WebJob 集成到 ADF 管道中 webjob 是一个非常简单的控制台应用程序 namespace WebJob4 class ReturnTest static double CalculateArea int r do
  • 负载平衡 Azure Blob 存储

    有没有什么办法可以实现负载均衡Azure Blob Storage只需使用Azure Load Balancer和Blob Storage 不需要服务 我想要实现的是点击负载均衡器网址 例如 https load balancer some
  • Papa Parse 在本地读取 CSV

    有人可以指出或向我展示 Papa Parse 读取 csv 文件的工作示例吗 当我尝试使用时 Papa parse file complete function results console log Finished results da
  • SSIS Master 包执行来自另一个项目的包

    我有多个SSIS项目 但其中的一些包是相同的 我想创建一个包含所有内容的项目generic包并将其他项目与他们的特定包一起保存 所以我的问题是 是否有可能有一个主包可以执行并将父变量传递给另一个项目的包 我是 SSIS 新手 如果这是一个明
  • 如何在 SQL Server 2008 中使用 GUID 数据类型?

    我想使用建立一个员工表SQL SERVER 2008 在我的表中 我希望为每个员工提供一个 ID 我听说过GUID我有点明白它是一种数据类型 但我无法使用它 你能告诉我使用它的方法吗 顺便说一句 假设我想要这样的东西 CREATE TABL
  • C# 查询两个数据库的数据

    我目前有一个查询 我正在从两个不同的数据库获取数据 这些数据被附加到一个名为 accountbuys 的列表中 我的第一个表有三个数据条目 3个想要购买股票的帐户 下一张表有 17 个数据点 购买 17 只股票 I am merging t
  • Windows Azure AppFabric 访问控制服务 (ACS) 中的 OAuth 2.0 身份提供程序

    OAuth 2 0 委派包含在 Azure AppFabric 访问控制服务中 http blogs objectsharp com cs blogs steve archive 2011 04 11 windows azure acces
  • 在 Postman 中请求受 Azure AD B2C 保护的 Azure 函数应用程序的访问令牌

    我有一个由 Azure Active Directory B2C 租户保护的 AspNetCore 2 0 MVC Web API 我已经能够通过以下 SO 发布使用 Postman 来测试 API 端点 在 Postman 中请求 Azu
  • 选择两列中两个日期之间的记录

    如何选择两列中两个日期之间的记录 Select From MyTable Where 2009 09 25 is between ColumnDateFrom to ColumnDateTo 我有一个日期 2009 09 25 我喜欢选择
  • 如何在 Azure 管道上运行 Karate API 测试

    空手道和 Azure 新手 刚刚使用空手道创建了一些 API 测试 而且很简单 想要进一步添加 Azure 管道 找到了一些仅指向添加 Microsoft 的 pom xml 和 maven 的链接 还发现了 Jekins 集成 但没有适用
  • 使用 PySpark 从 azure blob 存储读取 csv 文件

    我正在尝试使用 Microsoft Azure 上的 PySpark HDInsight 集群来做一个机器学习项目 要在我的集群上进行操作 请使用 Jupyter 笔记本 另外 我的数据 一个 csv 文件 存储在 Azure Blob 存
  • 导入到 SQL Server 时忽略 Excel 文件中的列

    我有多个具有相同格式的 Excel 文件 我需要将它们导入 SQL Server 我当前遇到的问题是 有两个文本列我需要完全忽略 因为它们是自由文本 并且某些行的字符长度超出了服务器允许我导入的长度 这会导致截断错误 因为我的分析不需要这些
  • SQL Server查询麻烦,多对多关系

    不知道如何用一行字来表达这个问题 对标题表示歉意 我的数据库中有3个表 例如 Shop Item 商店库存 Shop 和 Item 具有多对多关系 因此 ShopStock 表将它们链接起来 ShopStock 中的字段是 ID ShopI
  • 将证书安装到 Azure Web 应用上的受信任根证书存储

    如何将证书安装到 Azure Web 应用程序中 以便我的 azure web 应用程序可以通过 SSL 与远程服务通信 此特定证书未由公共 CA 签名 我使用 openssl 生成了一个 ssl 证书 当我将其安装到本地计算机上受信任的根
  • 从VBA中的数组批量插入到sql中

    我正在尝试在 Excel 中构建一个按钮 将所选区域上传到 SQL Server 中的表中 第一行将自动视为列标题 这件事该怎么继续下去呢 我想要的是简单和超快的上传 这是我的想法 我将选择选定的区域 然后将其保存为 txt 文件 然后对其
  • 如何通过Object Id和Column Id查询表数据?

    有桌子Clients PK LastName Name Address 1 Vidal Arturo St 2 Lavezzi Ezequiel St 3 Cuadrado Guillermo St 我想得到 通过以下查询 我可以得到前四列
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi
  • Invoke-Sqlcmd 运行脚本两次

    我遇到了一个非常奇怪的问题并且可以重复 基本上 我使用invoke sqlcmd通过使用 inputfile来调用脚本文件 但是如果脚本文件存在一些执行错误 例如插入到列不应为空的表中 则脚本文件将被执行两次 我也可以从探查器中看到这两个执
  • 仅从数据库获取我想要的数据但保留结构

    我正在尝试在 powerbi 上执行此操作 但我想这只是基本的 SQL 我想将我的数据导入到 powerBi 中 但使用一些 id 对其进行过滤 我们以这个例子为例 我与一些公司有数据库 表1 每个公司都有建筑物 表2 每个建筑物有员工 表
  • 删除原始数据中部分重复的记录

    我需要删除表中时间间隔为 1 或 2 分钟或相同且必须相同的所有记录ID但保留第一个记录 ID Time SN SD WE FW 10 2014 06 30 19 17 37 000 I 0 100 0 10 2014 06 30 19 1

随机推荐