在Databricks中向Azure存储文本文件追加DataFrame遇问题求助
Databricks中Pandas DataFrame追加到Azure容器文本文件的解决办法
你遇到的OSError: [Errno 95] Operation not supported错误,是因为DBFS(Databricks文件系统)的FUSE挂载路径对一次性写入大字符串的操作有限制,直接用df.to_string()写入触发了这个限制。以下是几种可行的替代方案:
方案1:分块写入DataFrame字符串
将DataFrame转换为字符串后,分块写入文件,避免一次性写入过大内容:
import pandas as pd logfile_test = '/dbfs/mnt/folderinAZcontainer/folder1/log/TestLog/test.txt' testdata = {'name':['Amar','Akbar','Antony'], 'empid':[1,2,3], 'sal':[100,50,70]} dftest = pd.DataFrame(testdata) # 生成DataFrame的字符串格式 df_str = dftest.to_string() # 按1024字节分块写入 with open(logfile_test, 'a') as f: for chunk in [df_str[i:i+1024] for i in range(0, len(df_str), 1024)]: f.write(chunk) f.write('\n') # 添加换行分隔每次追加的内容
方案2:借助临时文件+Databrils工具类
用本地临时文件存储DataFrame内容,再通过dbutils.fs追加到目标文件:
import pandas as pd import tempfile import os logfile_test = '/dbfs/mnt/folderinAZcontainer/folder1/log/TestLog/test.txt' testdata = {'name':['Amar','Akbar','Antony'], 'empid':[1,2,3], 'sal':[100,50,70]} dftest = pd.DataFrame(testdata) # 将DataFrame字符串写入本地临时文件 with tempfile.NamedTemporaryFile(mode='w', delete=False) as temp_f: temp_f.write(dftest.to_string()) temp_path = temp_f.name # 用dbutils将临时文件内容追加到目标路径 dbutils.fs.cp(f'file:{temp_path}', logfile_test, recurse=False) # 清理临时文件 os.unlink(temp_path)
方案3:转为Spark DataFrame写入(适合大数据量)
如果数据量较大,推荐转为Spark DataFrame后用追加模式写入,更适配Databricks的分布式环境:
import pandas as pd logfile_test = '/mnt/folderinAZcontainer/folder1/log/TestLog/test.txt' testdata = {'name':['Amar','Akbar','Antony'], 'empid':[1,2,3], 'sal':[100,50,70]} dftest = pd.DataFrame(testdata) # 转为Spark DataFrame spark_df = spark.createDataFrame(dftest) # 将每行转为字符串后追加写入 spark_df.rdd.map(lambda row: '\t'.join(str(col) for col in row)).saveAsTextFile(logfile_test, mode='append')
错误原因说明
DBFS通过FUSE挂载到/dbfs/路径时,对部分文件操作有兼容性限制,一次性写入df.to_string()生成的大字符串会触发底层文件系统的不支持错误,上述方案通过分块、中转或适配Spark API的方式绕过了这个限制。
内容的提问来源于stack exchange,提问作者Maharajaparaman
相关产品推荐
相关产品推荐

