如何将在线XLS文件定期导入Azure Databricks生成Delta表?
自动摄取在线XLS文件到Azure Databricks并生成Delta表
核心思路
直接通过Databricks代码拉取固定URL的在线XLS文件,在集群内完成数据解析、转换,最终写入Delta表,再通过Databricks Jobs实现每周自动调度,完全替代手动操作。
具体实现步骤
1. 编写数据处理代码(Notebook)
创建一个Databricks Notebook,写入以下逻辑:
方式1:内存直接处理(推荐,无需临时存储)
import requests from io import BytesIO import pandas as pd # 替换为你的固定XLS文件URL XLS_FIXED_URL = "https://your-target-url/weekly_data.xls" # 拉取在线XLS文件内容 resp = requests.get(XLS_FIXED_URL) xls_io = BytesIO(resp.content) # 读取XLS数据(可指定sheet_name,默认读第一个sheet) pd_df = pd.read_excel(xls_io, sheet_name=0, header=0) # 转换为Spark DataFrame spark_df = spark.createDataFrame(pd_df) # 可选:数据清洗/转换(根据你的业务需求调整) # spark_df = spark_df.dropDuplicates().na.fill(0) # 写入Delta表(支持DBFS路径或Unity Catalog表) # 写入DBFS路径 spark_df.write.mode("overwrite").format("delta").save("/dbfs/delta/weekly_xls_data") # 或者注册为Unity Catalog管理的表 # spark_df.write.mode("overwrite").format("delta").saveAsTable("main.default.weekly_xls_table")
方式2:先存储到DBFS再处理(如果需要保留原始文件)
如果需要留存原始XLS文件到DBFS,可改用以下代码(需确保集群安装了Spark Excel依赖):
import requests XLS_FIXED_URL = "https://your-target-url/weekly_data.xls" DBFS_STORAGE_PATH = "/dbfs/raw/weekly_xls/weekly_data.xls" # 拉取并保存到DBFS with open(DBFS_STORAGE_PATH, "wb") as f: f.write(requests.get(XLS_FIXED_URL).content) # 用Spark读取DBFS上的XLS文件 spark_df = spark.read.format("com.crealytics.spark.excel") \ .option("header", "true") \ .option("inferSchema", "true") \ .load("dbfs:/raw/weekly_xls/weekly_data.xls") # 后续写入Delta表逻辑同方式1 spark_df.write.mode("overwrite").format("delta").saveAsTable("main.default.weekly_xls_table")
注意:使用Spark Excel读取时,需在集群的Libraries中添加Maven依赖:
com.crealytics:spark-excel_2.12:0.13.5(版本需匹配你的Spark版本)。
2. 配置自动化调度(Databricks Jobs)
- 登录Azure Databricks控制台,进入Jobs页面
- 点击Create Job,配置任务信息:
- 任务类型选择Notebook,关联你编写的处理Notebook
- 选择执行集群(可使用Serverless集群或现有常规集群)
- 切换到Schedule标签,选择Recurring:
- 设置调度频率为Weekly,指定每周运行的具体时间(比如每周一凌晨1点)
- 保存并启用Job,系统会自动按设定时间执行数据摄取流程
关键注意事项
- 确保Databricks集群有访问外部URL的权限(如果是VNet部署的集群,需配置网络规则允许访问目标XLS文件的域名)
- 若XLS文件格式有变动(比如sheet名称、列结构),需同步调整代码中的读取参数
- 写入Delta表时,
mode("overwrite")会覆盖全表,若需要增量更新,需添加主键判断逻辑实现UPSERT
内容的提问来源于stack exchange,提问作者sgrewal116
相关产品推荐
相关产品推荐

