在Databricks中用变量指定Spark Excel的dataAddress读取ADLS Gen1文件
解决方法
一、用变量动态指定dataAddress范围
你原代码里的变量写法不会被自动解析,需要通过字符串拼接把变量值插入到dataAddress参数中,Python里常用两种实现方式:
方式1:f-string(Python 3.6+支持)
var_A = 'B1' var_B = 'C3' # 用f-string拼接动态地址 data_address = f"'Sheet1'!{var_A}:{var_B}" spark_df = spark.read.format("com.crealytics.spark.excel")\ .option("dataAddress", data_address)\ .option("header", False)\ .load('/mnt/adls/your_actual_path') # 替换为实际的ADLS挂载路径
方式2:str.format()方法
var_A = 'B1' var_B = 'C3' data_address = "'Sheet1'!{}:{}".format(var_A, var_B) spark_df = spark.read.format("com.crealytics.spark.excel")\ .option("dataAddress", data_address)\ .option("header", False)\ .load('/mnt/adls/your_actual_path')
两种方式都能正确将变量值替换到地址字符串中,实现动态指定Excel单元格范围。
二、其他读取ADLS Gen1中Excel文件到DataFrame的方法
如果spark_excel的方式不符合需求,还可以用以下两种常用方法:
方法1:Pandas读取后转Spark DataFrame
利用Pandas读取挂载在Databricks的ADLS文件,再转换为Spark DataFrame:
import pandas as pd # 直接读取指定sheet和单元格范围 pd_df = pd.read_excel('/dbfs/mnt/adls/your_actual_path/your_file.xlsx', sheet_name='Sheet1', usecols='B:C', skiprows=0, nrows=3) # 转换为Spark DataFrame spark_df = spark.createDataFrame(pd_df)
如果需要用变量动态调整范围,可修改参数:
start_col = 'B' end_col = 'C' start_row = 1 row_count = 3 pd_df = pd.read_excel('/dbfs/mnt/adls/your_actual_path/your_file.xlsx', sheet_name='Sheet1', usecols=f'{start_col}:{end_col}', skiprows=start_row-1, # skiprows为跳过的行数,B1对应跳过0行 nrows=row_count) spark_df = spark.createDataFrame(pd_df)
方法2:openpyxl精细读取后构造DataFrame
用openpyxl直接操作Excel单元格,再手动构造DataFrame:
from openpyxl import load_workbook import pandas as pd # 加载Excel文件 wb = load_workbook('/dbfs/mnt/adls/your_actual_path/your_file.xlsx') ws = wb['Sheet1'] # 指定单元格范围 start_cell = 'B1' end_cell = 'C3' # 提取范围内的单元格数据 data = [] for row in ws[start_cell:end_cell]: data.append([cell.value for cell in row]) # 转换为Spark DataFrame pd_df = pd.DataFrame(data) spark_df = spark.createDataFrame(pd_df)
注意:以上方法均需确保ADLS Gen1已正确挂载到Databricks,且你拥有对应文件的读取权限。
内容的提问来源于stack exchange,提问作者RohanChandra
相关产品推荐
相关产品推荐

