我相信我理解Spark SQL中托管表和外部表之间的基本区别。为了清楚起见,下面是我将如何解释它。
managed table是一个Spark SQL表,Spark为其管理数据和元数据。在托管表的情况下,Databricks将元数据和数据存储在帐户中的DBFS中。因为Spark SQL是管理表的,所以DROP TABLE会同时删除元数据和数据。
另一个选择是让Spark SQL管理元数据,而你控制数据位置。我们将其称为非托管表。Spark SQL管理相关的元数据,所以当你执行DROP TABLE时,Spark只删除元数据,而不删除数据本身。数据仍然存在于您提供的路径中。
现在,随着时间的推移,当涉及到创建外部表时,我遇到了一些不同的警告。我将在下面发布相关的Spark SQL查询和我对它的理解。我想知道我的理解是否正确,我也想听到任何额外的见解。 查询1
CREATE TABLE test_tbl
USING CSV
LOCATION '/mnt/csv_files'
这个基本查询将使用存储在给定LOCATION
中的数据创建一个表。此处不会创建额外的目录或数据文件,数据将继续驻留在'/mnt/csv_files'
中。
在此表中插入、更新或删除的任何数据将反映在给定路径下的数据文件中?
查询2
CREATE TABLE test_tbl(id STRING, value STRING)
USING PARQUET
OPTIONS (PATH '/mnt/test_tbl')
这个查询将创建表,但也创建一个由给定路径定义的目录。添加到该表中的任何数据都将导致在定义的路径中创建数据文件。:'/mnt/test_tbl'
.
OPTIONS (PATH ..)
条款和LOCATION
条款有什么不同吗?
查询3
CREATE TABLE test_tbl
LOCATION '/mnt/test_tbl'
AS SELECT * FROM tmp
与前面的查询类似,这将创建表,但也将创建一个由给定路径定义的目录。然而,数据将来自VIEWtmp
,正如AS
查询所定义的那样。基于此视图中的数据,数据文件也将在新目录中创建。
对该表执行的任何操作都将反映在这样创建的数据文件中,VIEW将保持不变。
以上给出的解释正确吗?还有其他方法可以用来创建外部表吗?
查询1:Your understanding is correct.
查询2:据我所知,Location和Path做同样的事情。Location的使用更倾向于HIVE风格,而Options(Path)的使用更倾向于Scala/Python风格。除此之外,我认为他们没有什么不同。
查询3:Yes View tmp的输出将被存储在location中。对该表的任何操作都不会影响原来的视图。我唯一想补充的是,在第三种语法中,如果你错过了USING,那么默认情况下,它会在较新的dbr中创建一个DELTA表。
可以使用
检查表定义%sql
describe formatted test_tbl
向下滚动并查找"TYPE"的值。应该是External