在Microsoft Fabric中将DataFrame写入Lakehouse时CSV转Delta的问题求助
解决Microsoft Fabric中DataFrame写入CSV生成文件夹及Delta文件的问题
问题根源
在Fabric的Spark环境中,直接用save方法指定带.csv后缀的路径时,Spark会将该后缀识别为文件夹名称而非文件名;若目标路径关联了Delta表的存储目录,也会导致格式被异常覆盖。
解决方案
方案1:Spark分区合并+手动重命名(适合大数据量)
通过合并分区生成单个CSV文件,再重命名为目标文件名:
# 合并为单个分区,避免生成多个分片文件 df_sales.coalesce(1) .write.format("csv") .mode("overwrite") .option("header", "true") # 按需添加表头 .save("Files/Sales/PerLoadDate/temp_sales_20210101") # 重命名临时文件并清理文件夹 import os import shutil from pyspark.sql import SparkSession spark = SparkSession.getActiveSession() # 获取临时文件夹下的CSV文件 temp_dir = "/lakehouse/default/Files/Sales/PerLoadDate/temp_sales_20210101" csv_files = [f for f in os.listdir(temp_dir) if f.endswith(".csv")] if csv_files: # 重命名为目标文件名 os.rename(f"{temp_dir}/{csv_files[0]}", "/lakehouse/default/Files/Sales/PerLoadDate/sales_20210101.csv") # 删除临时文件夹 shutil.rmtree(temp_dir)
方案2:使用mssparkutils直接写入(适合中小数据量)
利用Fabric内置工具直接生成指定文件名的CSV:
import mssparkutils import pandas as pd # 将Spark DataFrame转为Pandas DataFrame pd_df = df_sales.toPandas() # 写入CSV到目标路径,覆盖已存在文件 output_path = "Files/Sales/PerLoadDate/sales_20210101.csv" mssparkutils.fs.put(output_path, pd_df.to_csv(index=False), overwrite=True)
方案3:检查路径关联的Delta表
确认Files/Sales/PerLoadDate路径未绑定Delta表:
- 打开Lakehouse界面,查看该路径下是否存在
_delta_log文件夹 - 若存在,说明该路径被用作Delta表存储,需更换输出路径或清理Delta元数据
注意事项
- 若不需要单个CSV文件,仅需CSV格式输出,可去掉
coalesce(1),并将保存路径改为无.csv后缀的文件夹名(如save("Files/Sales/PerLoadDate/sales_20210101")),此时文件夹内会生成多个CSV分片文件 - 方案2中,若数据量过大,转为Pandas DataFrame可能出现内存溢出,优先使用方案1
内容的提问来源于stack exchange,提问作者PFrantz
相关产品推荐
相关产品推荐

