Google Ad Manager API下载报告显示存到/tmp但Databricks DBFS找不到
问题根因说明
- 你看到的
/tmp路径是Databricks集群执行任务的worker节点的本地临时文件系统,和DBFS属于完全隔离的存储层,下载到节点本地的文件不会自动同步到DBFS,因此你在DBFS路径下无法检索到该文件。 AttributeError: 'str' object has no attribute 'write'报错的原因是Google Ad Manager API的报告下载方法要求传入可写的文件对象,你直接传入字符串格式的DBFS存储路径,不符合参数要求,因此触发属性错误。
解决步骤
方案1:本地中转后同步到DBFS(适配官方示例,改造成本最低)
- 保留官方示例的下载逻辑,先将报告压缩包下载到节点本地
/tmp路径,无需修改原有下载参数 - 调用Databricks内置的
dbutils工具将本地文件同步到DBFS,注意本地路径需要加file:前缀标识为节点本地文件系统:
# 示例:将本地/tmp下的gam_report.csv.gz同步到DBFS的/gam_reports/目录下 dbutils.fs.cp("file:/tmp/gam_report.csv.gz", "dbfs:/gam_reports/gam_report.csv.gz")
- 验证文件是否成功存入DBFS:
dbutils.fs.ls("/gam_reports/")
后续可以直接用Spark读取DBFS路径下的压缩csv文件:
df = spark.read.option("compression", "gzip").csv("dbfs:/gam_reports/gam_report.csv.gz", header=True)
方案2:直接写入DBFS(无需本地中转)
如果你不想走本地存储中转,可以通过DBFS FUSE挂载路径直接打开可写文件对象,传入GAM API的下载参数:
# 通过/dbfs前缀的FUSE挂载路径打开可写二进制文件对象 with open("/dbfs/gam_reports/gam_report.csv.gz", "wb") as report_file: # 将文件对象传入GAM报告下载方法,替换原有路径参数 report_downloader.DownloadReportToFile(report_job_id, "CSV", report_file)
注意:
/dbfs/前缀的路径是Databricks运行时默认挂载的DBFS访问入口,仅支持在Databricks集群的执行环境中使用。
内容的提问来源于stack exchange,提问作者esteebie
相关产品推荐
相关产品推荐

