Spark托管表删除影响、格式转换及存储位置技术问询
Spark托管表常见问题解答
背景场景
我最近开始学习Spark,正在研究Spark托管表。根据文档说明,Spark同时管理数据和元数据。假设我在S3中有一个CSV文件,通过以下代码将其读取为DataFrame:
df = spark.read .format("csv") .option("header", "true") .option("inferSchema", "true") .load("s3a://databricks-learning-s333/temp/flights.csv")
随后我在Databricks中通过以下代码创建了一个Spark托管表:
CREATE DATABASE learn_spark_db; USE learn_spark_db; CREATE TABLE managed_us_delay_flights_tbl (date STRING, delay INT, distance INT, origin STRING, destination STRING);
df.write.saveAsTable("managed_us_delay_flights_tbl")
该表为Spark托管表,由Spark同时管理数据和元数据。根据文档,删除托管表时Spark会同时删除元数据和实际数据。
问题与解答
问题1:执行DROP TABLE managed_us_delay_flights_tbl时,是否会删除我S3中的原始数据?Spark所说的删除数据和元数据具体指什么?
- 不会删除S3中的原始CSV数据。
- 元数据指表的结构信息(字段名、数据类型、分区规则等),存储在Spark的元数据仓库(如Databricks内置元存储、Hive Metastore)中,执行
DROP TABLE时这些信息会被彻底清除。 - 数据指的是Spark创建托管表时,将DataFrame写入的那份数据副本(托管表对应的底层存储数据),而非最初读取的原始CSV文件。删除表时只会删除这份托管副本,原始S3文件不受影响。
问题2:创建托管表时Spark会使用Delta格式,而我的原始数据是S3中的CSV格式,这意味着Spark会将CSV转换为Delta格式,还是会复制数据并以Delta格式写入其他位置?
- Spark会复制原始CSV的数据,将其转换为Delta格式后写入托管表的专属存储位置,不会修改原始CSV文件。
- 调用
saveAsTable写入托管表时,Spark会按照当前默认格式(Databricks中默认是Delta)重新序列化数据,生成新的Delta格式文件存储在托管表路径下,原始CSV文件保持独立。
问题3:创建Spark托管表时,会使用原底层存储还是新的存储位置?请详细解释。
- 创建托管表时会使用新的专属存储位置,而非原始CSV所在的S3路径。
- 具体逻辑:
- 在Databricks中创建数据库(如
learn_spark_db)时,系统会自动为该数据库分配默认存储路径(通常是Workspace根存储目录下的dbfs:/user/hive/warehouse/learn_spark_db.db/)。 - 创建托管表并写入数据时,Spark会在该数据库路径下为表创建子目录,专门存储转换后的Delta格式数据。
- 原始CSV的S3路径与托管表存储路径完全独立,托管表的操作不会影响原始数据的存储位置。
- 在Databricks中创建数据库(如
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

