【问题标题】:Copy files of different format with one copy activity ADF使用一个复制活动 ADF 复制不同格式的文件
【发布时间】:2021-09-01 20:02:28
【问题描述】:

我是 Azure 数据工厂的新手,我正在尝试解决将文件从 ftp 复制到 azure 存储帐户时遇到的一个特定问题。我必须将文件从源文件夹复制到目标文件夹。源文件夹中的文件格式不同(csv、txt、xml),当我执行管道时,所有文件都以 .txt 扩展名复制。

我不确定如何复制文件并保持其原始格式

有什么帮助吗?

注意:我认为问题是我没有在输出数据集中指定的输出文件名,但是当我通过将文件名设置为 item().name 来指定它时,它是包含文件的文件夹的名称被复制而不是文件..任何解决方案?

【问题讨论】:

  • 感谢您的回复。它已经是空的,但它仍然添加了扩展名。 txt,根据我的理解,当没有为输出数据集指定 fileName 时,生成的文件的名称采用 Data._Guid_.txt 格式,当我在输出数据集中指定文件名时,像这样 --> 文件:@ item().name ,它复制块 blob 中的文件夹名称,而不是复制文件夹中的文件(具有 dat 和 csv 格式的文件)。所以我不知道还能做什么。
  • Sink 的 File extension 属性中给出了什么?默认情况下文件扩展名为“.txt”,如果不是,则将其设为空,然后重试。
  • 指定输出文件名后是否正常?
  • 是的,仍然无法正常工作,我正在使用它们的文件复制多个文件夹,因此在指定文件名时,我输入了 : file : @item().name ,它的作用是复制文件夹的名称而不是文件的名称。

标签: format copy azure-data-factory


【解决方案1】:

尝试使用二进制格式。

https://docs.microsoft.com/en-us/azure/data-factory/format-binary.

您可以在复制活动、GetMetadata 活动或删除活动中使用二进制数据集。使用二进制数据集时,ADF 不会解析文件内容,而是按原样处理。

...

以下是 Azure Blob 存储上的二进制数据集示例:

{
   "name": "BinaryDataset",
   "properties": {
       "type": "Binary",
       "linkedServiceName": {
           "referenceName": "<Azure Blob Storage linked service name>",
           "type": "LinkedServiceReference"
       },
       "typeProperties": {
           "location": {
               "type": "AzureBlobStorageLocation",
               "container": "containername",
               "folderPath": "folder/subfolder",
           },
           "compression": {
               "type": "ZipDeflate"
           }
       }
   }
}

【讨论】:

  • 二进制格式不起作用它返回此错误:二进制副本不支持从文件夹复制到文件。我已经使用了 csv 格式,有什么方法可以让它使用它吗?
  • 如果您要复制的某些文件不是 csv,则不能使用 csv 格式。你能指定你看到的错误吗?听起来您可能只需要在源文件夹上指定获取元数据活动,然后将文件复制到 for each 循环中的新位置。
  • 这正是我所做的并且工作正常,我唯一的问题是生成文件的名称是 Data._Guid_.txt 格式而不是它们的原始格式(.csv 和 .dat)
  • 使用元数据活动的输出动态指定复制活动接收器中的文件名
  • 喜欢这个文件名:@item().name?我这样做了,但是在调试时它会复制文件夹的名称而不是实际的文件。我的源文件的结构如下所示: folder1 file1.csv file2.csv folder2 file.dat file2.dat
【解决方案2】:

使用Get Metadata 活动从路径中获取文件夹列表,并使用Foreach 循环活动循环浏览文件夹并将文件复制到接收器。

  1. 使用二进制数据集作为源和接收器来复制文件。
  2. 使用Get Metadata 获取文件夹列表。您可以参数化路径或对其进行硬编码。

Get Metada 活动的输出:

  1. Get Medata 活动连接到Foreach 循环并将childitems 传递给项目列表。

    @activity('Get Metadata1').output.childitems

  1. 在 Foreach 循环中添加 copy data 活动,并通过连接源数据集路径和 Foreach 循环的当前项动态添加文件夹路径。

    @concat(pipeline().parameters.folderpath, '/', item().name, '/')

  1. 在 Sink 中,将其连接到二进制数据集。

  1. 运行管道时,您可以看到从源复制到接收器的所有文件,无论扩展名如何。

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 2019-12-26
    • 2022-01-13
    • 2019-06-23
    相关资源
    最近更新 更多