在加载之前,我需要从 delta-lake 表中删除某些数据。如果存在,我可以从增量表中删除数据,但当表不存在时,它会失败。
下面是 Databricks scala 代码
// create delete statement
val del_ID = "Check_ID =" + "123"
// get delta table from path where data exists
val deltaTable = DeltaTable.forPath(spark, path)
// delete data from delta table
deltaTable.delete(del_ID)
上述代码仅当增量数据存在于该路径上时才有效,否则将失败。
有人可以分享一种方法,如果增量数据存在,则执行删除语句,否则删除语句将被忽略?
根据DeltaTable的Javadoc,您可以使用以下命令检查指定路径中是否存在增量表:
DeltaTable.isDeltaTable(spark, "path/to/table")
如果路径不包含增量表或者不存在,则返回 false。所以你的代码是:
val del_ID = "Check_ID ="+ "123"
if (DeltaTable.isDeltaTable(spark, path)) {
DeltaTable.forPath(spark, path).delete(del_ID)
}
在 python 中使用 Spark SQL API 的另一种方法:
spark.sql(f'describe detail {path}').collect()[0].asDict()['format'] == 'delta'
当您无法使用 Delta API(如 databricks-connect 中)时,这会很方便。
可以检查catalog的information_schema中是否存在该表。该查询的结果(参见下面的 result_df)将是一个空表(如果这样的表不存在),或者是一个包含行的表。之后,您使用“if”应用逻辑 - 如果 result_df 不为空 - 执行某些操作,删除表等,否则执行其他操作。
如果您直接使用下面的代码,请不要忘记将“some_catalog_name”替换为您的目录名称,并将“您检查是否存在的表”替换为您的表名称。
result_df = spark.sql(f'SELECT * FROM some_catalog_name.information_schema.tables WHERE table_name = "the table you check if exists"')
if not (result_df.isEmpty()):
do something ...
else:
do something else ...