如何在Databricks Notebook中基于IF条件挂载Azure Blob?
问题描述
现有Blob存储中的文件,原本在Databricks Notebook中挂载路径为:
fileIn = '/mnt/myfile'
该文件按年份拆分为两个文件后,对应已挂载的路径为:
fileInA = '/mnt/myfile2015' fileInB = '/mnt/myfile2022'
Notebook通过以下代码接收year作为输入参数:
dbutils.widgets.text("year", "2019")
需要根据输入年份动态指定要使用的挂载文件路径。尝试过两种方式均失败:
- SQL方式:执行后仅返回SQL语句本身,无法完成路径赋值
fileIn = SELECT if(year < 2022, 'fileInA', 'fileInB'); - Python函数方式:函数未完善逻辑,无法生效
def mountbyyear(year): # if(int(year)<2022): # fileIn = '/mnt/myfile2015' # else: # fileIn = '/mnt/myfile2022' mountbyyear(year)
请问如何在Databricks Notebook中基于IF条件动态指定Blob文件的挂载路径?
解决方案
场景1:选择已挂载的路径
如果/mnt/myfile2015和/mnt/myfile2022已经完成挂载,只需通过Python条件判断动态赋值路径变量即可:
- 获取输入的年份参数
year = dbutils.widgets.get("year")
- 转换为整数后进行条件判断,赋值目标路径
year_int = int(year) if year_int < 2022: fileIn = '/mnt/myfile2015' else: fileIn = '/mnt/myfile2022'
- 后续直接使用
fileIn操作文件即可,例如读取CSV:
df = spark.read.csv(fileIn, header=True)
场景2:动态挂载(按需挂载对应文件)
如果需要根据年份动态挂载Blob文件到统一路径(比如/mnt/myfile),则在条件判断中调用dbutils.fs.mount方法:
# 获取并转换年份参数 year = dbutils.widgets.get("year") year_int = int(year) # 定义统一挂载点 mount_point = '/mnt/myfile' # 先卸载已存在的挂载(如果有) for mount in dbutils.fs.mounts(): if mount.mountPoint == mount_point: dbutils.fs.unmount(mount_point) break # 根据年份选择Blob源路径 storage_account = "your_storage_account_name" container = "your_container_name" if year_int < 2022: source_path = f"wasbs://{container}@{storage_account}.blob.core.windows.net/myfile2015" else: source_path = f"wasbs://{container}@{storage_account}.blob.core.windows.net/myfile2022" # 执行挂载(替换为你的存储账户密钥或SAS令牌) dbutils.fs.mount( source=source_path, mount_point=mount_point, extra_configs={ f"fs.azure.account.key.{storage_account}.blob.core.windows.net": "your_storage_account_key" } )
内容的提问来源于stack exchange,提问作者otk
相关产品推荐
相关产品推荐

