如何从 spark sql databricks 中的临时视图或等效视图中删除?

Posted

技术标签:

【中文标题】如何从 spark sql databricks 中的临时视图或等效视图中删除?【英文标题】:How to delete from a temp view or equivalent in spark sql databricks? 【发布时间】:2021-06-17 03:16:44 【问题描述】:

我需要从数据块中的临时视图中删除,但看起来我只能合并、选择和插入。也许我错过了一些东西,但我没有找到任何关于此的文档。

第 1 步:我在这里创建一个临时视图:

table_df = spark.read.format('delta).load("mnt/table_path")
table_df.createOrReplaceTempView("table_name")

第 2 步:然后尝试删除:

%sql 
delete from table_name
where id in (1,2,3)

得到:

无效命令:'table_name' 是视图而不是表。第 1 行 pos 0;

第 3 步:

table_name_delta = DeltaTable.forPath(spark, "mnt/table_path")
last_actions = table_name_delta.history(1).collect()

它适用于合并、选择和插入。这里有几个限制:

我不想创建增量表来继续删除,因为其他笔记本/集群中不应访问该视图。 我想访问在 STEP 3 中创建的增量表的日志,并且 看到删除语句发生了 我有一个限制,只能使用源表和目标表,并且 没有中间表

是否可以从视图或等效项中删除?是否有等效的临时视图支持删除?

【问题讨论】:

【参考方案1】:

Apache spark 不支持删除操作。您可以通过对数据框应用过滤器或使用过滤条件创建另一个临时表来实现它。

    创建示例 DataFrame 的步骤
data = spark.createDataFrame([("Alberto", 1), 
                              ("Dakota", 2), 
                              ("Kumar", 3),
                              ("Siva", 4),
                              ("Sree", 5),
                              ("Kavin", 6)], 
                                   ["Name", "id"])

data.createOrReplaceTempView("table_name")

在您的 spark SQL 中,您可以使用过滤后的值创建另一个视图,如下所示:

%sql 
CREATE OR REPLACE TEMPORARY VIEW table_name1 AS SELECT id, name FROM table_name WHERE id not in(1, 2);
select * from table_name1;

Sample Databricks notebook

【讨论】:

谢谢 Sivakumar,这个解决方案是有效的,不幸的是我不能在我的情况下使用它。我无法创建另一个表,因为我有一个约束,只能使用源表和目标表,而没有中间表。我编辑了我的答案。

以上是关于如何从 spark sql databricks 中的临时视图或等效视图中删除?的主要内容,如果未能解决你的问题,请参考以下文章

spark sql如何在databricks中创建表

如何在 Spark Databricks 中注册 SQL 函数

Databricks/Spark SQL - 如何在地图类型字段中获取数据

如何计算 Spark SQL(Databricks)中表中的列数?

如何使用 Databricks 使用服务原理通过 spark 数据框将批量数据插入 Sql Server 数据仓库

如果 Databricks 或 Spark SQL 中存在表,则插入