You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Azure Data Factory接收器数据集配置求助:FTP多文件夹及文件复制至Azure存储账户异常问题

解决FTP到Azure存储复制的两个核心问题

针对你遇到的这两个复制配置问题,我来给你拆解解决方案:

问题1:@item().name参数未生效,复制了文件夹而非文件

这个问题的核心是你的循环逻辑和数据集参数没对应上——大概率是Foreach循环遍历的是文件夹,而非单个文件,导致@item().name指向的是文件夹名,而非文件名。按以下步骤调整:

  1. 调整Get Metadata的层级,确保拿到文件列表

    • 如果你要批量复制多个文件夹下的.dat/.csv,建议分两层处理:
      • 第一层Get Metadata:指向FTP根目录,勾选Child items获取所有子文件夹
      • 第二层(Foreach循环内):针对每个文件夹,再添加一个Get Metadata,勾选Child items获取该文件夹下的所有文件,同时用Filter活动筛选出符合格式的文件(表达式:@or(endsWith(item().name, '.dat'), endsWith(item().name, '.csv'))
    • 确保最终Foreach循环的输入是单个文件的元数据列表,而非文件夹列表
  2. 正确配置输出数据集的参数和路径

    • 在Azure存储输出数据集中添加两个参数:targetFolder(目标存储的文件夹路径)和sourceFileName(原始文件名)
    • 数据集的文件路径设置为:@concat(dataset().targetFolder, '/', dataset().sourceFileName)
    • 在Copy活动的接收器参数赋值:
      • targetFolder:可以固定为你的目标存储路径,比如ftp-files
      • sourceFileName@item().name(此时item是单个文件的元数据,所以name就是带扩展名的原始文件名)

问题2:自动添加.txt扩展名,丢失原文件格式

这个是因为当你未明确指定文件名时,ADF会默认用自动生成的名称+.txt后缀,同时如果文件格式选错也会触发这个问题。解决方法如下:

  1. 明确指定原始文件名

    • 在Copy活动的接收器设置中,找到「文件名」选项,选择「来自源文件的名称」,或者直接用表达式提取原始文件名:
      @last(split(item().name, '/'))
      
      这个表达式能从完整的FTP文件路径中提取最后一段(即带扩展名的原始文件名)
  2. 匹配正确的文件格式

    • 对于.csv文件:设置数据集格式为Delimited Text,并勾选「第一行作为标题」(如果需要)
    • 对于.dat文件:设置数据集格式为Binary(因为.dat通常是二进制或自定义格式,用Binary可以避免ADF自动添加文本后缀,同时完整保留原始内容)

完整流程示例

  1. Get Metadata(FTP根目录):获取所有子文件夹,输出为childItems
  2. Foreach循环:遍历上述文件夹列表
    • 内部添加Get Metadata(当前文件夹):获取该文件夹下的所有子项
    • 内部添加Filter活动:筛选出.dat.csv文件,输出为filteredFiles
    • 内部添加Foreach循环:遍历filteredFiles列表
      • 内部添加Copy活动
        • 源数据集:FTP,路径设置为@item().folderPath,文件名设置为@item().name
        • 接收器数据集:Azure存储,参数targetFolder设为你的目标路径,sourceFileName设为@item().name,文件格式对应选择Delimited TextBinary

这样配置后,就能精准复制指定格式的文件,完整保留原始文件名和扩展名,不会复制整个文件夹。

内容的提问来源于stack exchange,提问作者kira_22

火山引擎 最新活动