You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:02:49