在Databricks中使用Spark SQL创建外部表的不同方法



我相信我理解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

相关内容

  • 没有找到相关文章

最新更新