如何在Synapse Analytics中将文件复制到独立文件夹
解决Synapse Bronze到Silver层的文件夹结构调整问题
方法一:用Synapse管道原生活动实现(无需Notebook)
基于你现有Get Metadata + For Each的流程,只需添加创建文件夹的步骤,再调整目标文件路径即可:
- 调整Get Metadata活动:确保该活动获取Bronze层的
Child items(子文件列表),后续循环将遍历这些文件项。 - 在For Each循环内添加Create Folder活动:
- 配置文件夹路径为动态表达式:
解释:@concat('silver/', split(item().name, '.')[0])split(item().name, '.')[0]会从带扩展名的文件名(如file1.avro)中提取纯文件名file1,拼接后得到silver/file1的文件夹路径。
- 配置文件夹路径为动态表达式:
- 修改复制/转换活动的目标路径:
- 若使用Copy Activity:
- 源数据集路径设为
@concat('bronze/', item().name),指向Bronze层的对应Avro文件。 - 目标数据集路径设为:
最终会生成@concat('silver/', split(item().name, '.')[0], '/', split(item().name, '.')[0], '.parquet')silver/file1/file1.parquet的目标文件路径。
- 源数据集路径设为
- 若使用Data Flow:在目标数据集的路径配置中,同样使用上述动态表达式,将输出文件指向对应子文件夹。
- 若使用Copy Activity:
方法二:修正Notebook动态创建文件夹的逻辑
如果偏好使用Notebook处理,检查并调整以下代码逻辑(以PySpark为例),确保能正确创建文件夹并写入文件:
# 从管道获取当前遍历的文件名参数(需在For Each调用Notebook时传递此参数) file_name = dbutils.widgets.get("file_name") # 提取不带扩展名的纯文件名 base_name = file_name.split('.')[0] # 替换为你的存储容器路径 storage_root = "abfss://your-container@your-storage-account.dfs.core.windows.net/" # 构建目标文件夹路径 target_folder = f"{storage_root}silver/{base_name}/" # 检查文件夹是否存在,不存在则创建 if not dbutils.fs.exists(target_folder): dbutils.fs.mkdirs(target_folder) # 读取Bronze层Avro文件 bronze_file_path = f"{storage_root}bronze/{file_name}" df = spark.read.format("avro").load(bronze_file_path) # 写入Silver层对应文件夹的Parquet文件,覆盖原有内容 target_file_path = f"{target_folder}{base_name}.parquet" df.write.mode("overwrite").format("parquet").save(target_file_path)
在管道的For Each活动中,配置调用Notebook时传递参数file_name,参数值设为@item().name,确保Notebook能获取到当前循环的文件名。
注意事项
- 确保Synapse使用的托管身份/服务主体对Silver层存储路径拥有创建文件夹和写入文件的权限。
- 若使用Copy Activity,需确保目标数据集的文件路径设置为动态内容,而非固定值。
- For Each循环的迭代项需选择Get Metadata活动输出的
Child items,保证每个Bronze层文件都能被遍历处理。
内容的提问来源于stack exchange,提问作者Moody_girl
相关产品推荐
相关产品推荐

