如何在Databricks中将DBFS文件及文件夹上传至ADLS?
从DBFS迁移文件到ADLS并在Databricks中访问的操作指南
一、前期准备
- 确保已创建Azure Data Lake Storage Gen2存储账户及目标容器
- 在Databricks中配置ADLS访问权限(推荐使用服务主体):
- 创建Azure AD服务主体,为其分配存储账户的
Storage Blob Data Contributor角色 - 在Databricks集群或笔记本中配置凭据:
spark.conf.set("fs.azure.account.auth.type.<存储账户名>.dfs.core.windows.net", "OAuth") spark.conf.set("fs.azure.account.oauth.provider.type.<存储账户名>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider") spark.conf.set("fs.azure.account.oauth2.client.id.<存储账户名>.dfs.core.windows.net", "<服务主体Client ID>") spark.conf.set("fs.azure.account.oauth2.client.secret.<存储账户名>.dfs.core.windows.net", "<服务主体Client Secret>") spark.conf.set("fs.azure.account.oauth2.client.endpoint.<存储账户名>.dfs.core.windows.net", "https://login.microsoftonline.com/<租户ID>/oauth2/token")
- 创建Azure AD服务主体,为其分配存储账户的
二、迁移DBFS文件到ADLS
提供3种常用迁移方式,按需选择:
方式1:dbutils.fs命令(适合小批量文件)
支持单文件或递归复制整个文件夹:
# 复制单个文件 dbutils.fs.cp("dbfs:/源路径/文件名", "abfss://<容器名>@<存储账户名>.dfs.core.windows.net/目标路径/文件名") # 递归复制整个文件夹 dbutils.fs.cp("dbfs:/源文件夹路径", "abfss://<容器名>@<存储账户名>.dfs.core.windows.net/目标文件夹路径", recurse=True)
方式2:Spark批量迁移(适合大文件/海量文件)
利用Spark分布式能力高效处理大规模迁移:
# 读取DBFS源目录下的所有文件元数据 source_files = spark.read.format("binaryFile").load("dbfs:/源路径/**") # 定义文件复制逻辑 def copy_single_file(row): source_path = row["path"] target_path = source_path.replace("dbfs:/", "abfss://<容器名>@<存储账户名>.dfs.core.windows.net/目标根路径/") dbutils.fs.cp(source_path, target_path) # 批量执行复制 source_files.foreach(copy_single_file)
方式3:Azure CLI(适合脚本化批量操作)
在本地或云Shell中执行:
# 登录Azure账户 az login # 递归复制DBFS文件到ADLS az databricks fs cp dbfs:/源路径 abfss://<容器名>@<存储账户名>.dfs.core.windows.net/目标路径 --recursive
三、验证迁移结果
检查文件完整性:
# 统计源目录文件数量 source_file_count = len(dbutils.fs.ls("dbfs:/源路径")) # 统计目标目录文件数量 target_file_count = len(dbutils.fs.ls("abfss://<容器名>@<存储账户名>.dfs.core.windows.net/目标路径")) print(f"源文件数: {source_file_count}, 目标文件数: {target_file_count}")
也可随机抽取文件对比大小,确认无损坏或丢失。
四、在Databricks中访问ADLS文件
迁移完成后,有两种常用访问方式:
方式1:直接使用ABFS路径
无需挂载,直接通过ABFS路径读写:
# 读取ADLS中的CSV文件 df = spark.read.csv("abfss://<容器名>@<存储账户名>.dfs.core.windows.net/目标路径/data.csv") # 将数据写入ADLS为Parquet格式 df.write.parquet("abfss://<容器名>@<存储账户名>.dfs.core.windows.net/目标路径/output.parquet")
方式2:挂载ADLS到DBFS(可选,适配原有路径习惯)
将ADLS容器挂载到DBFS,保持熟悉的路径风格:
# 挂载ADLS容器到DBFS指定路径 dbutils.fs.mount( source = "abfss://<容器名>@<存储账户名>.dfs.core.windows.net/", mount_point = "/mnt/adls-mount", extra_configs = { "fs.azure.account.auth.type.<存储账户名>.dfs.core.windows.net": "OAuth", "fs.azure.account.oauth.provider.type.<存储账户名>.dfs.core.windows.net": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider", "fs.azure.account.oauth2.client.id.<存储账户名>.dfs.core.windows.net": "<服务主体Client ID>", "fs.azure.account.oauth2.client.secret.<存储账户名>.dfs.core.windows.net": "<服务主体Client Secret>", "fs.azure.account.oauth2.client.endpoint.<存储账户名>.dfs.core.windows.net": "https://login.microsoftonline.com/<租户ID>/oauth2/token" } ) # 通过挂载路径访问文件 df = spark.read.csv("/mnt/adls-mount/目标路径/data.csv")
内容的提问来源于stack exchange,提问作者user19930511
相关产品推荐
相关产品推荐

