如何在Synapse Notebook中用Spark SQL读取Data Lake的Delta表及历史?
解决Delta表历史记录查询问题
问题原因
你创建的临时视图是基于Delta表的数据内容生成的DataFrame,仅包含表的行数据,没有关联Delta表的元数据(版本、历史操作等),因此DESCRIBE HISTORY命令无法识别该视图——这个命令需要直接针对Delta表的元数据入口(要么是注册到元数据的Delta表,要么是Delta表的存储路径)。
解决方案
方案1:Spark SQL直接通过路径查询历史
无需创建临时视图,直接在Spark SQL中指定Delta表的存储路径执行DESCRIBE HISTORY:
DESCRIBE HISTORY 'abfss://mysource@mydatalake.dfs.core.windows.net/Silver/ProductModelProductDescription'
方案2:通过DeltaTable对象获取历史并转为SQL可查的视图
利用你已创建的DeltaTable对象获取历史记录,再将其转为临时视图供Spark SQL查询:
from delta.tables import DeltaTable path = 'abfss://mysource@mydatalake.dfs.core.windows.net/Silver/ProductModelProductDescription' delta_table = DeltaTable.forPath(spark, path) # 获取Delta表的历史记录DataFrame history_df = delta_table.history() # 创建临时视图,供Spark SQL查询 history_df.createOrReplaceTempView("ProductModelProductDescription_History")
之后就可以用Spark SQL查询历史:
SELECT * FROM ProductModelProductDescription_History
方案3(可选):将Delta表注册为元数据中的表
如果需要长期通过表名而非路径查询,可以将Delta表注册到Synapse的元数据库中:
spark.sql(f""" CREATE TABLE IF NOT EXISTS ProductModelProductDescription USING DELTA LOCATION 'abfss://mysource@mydatalake.dfs.core.windows.net/Silver/ProductModelProductDescription' """)
注册完成后,直接用表名执行历史查询:
DESCRIBE HISTORY ProductModelProductDescription
内容的提问来源于stack exchange,提问作者Joost
相关产品推荐
相关产品推荐

