External Table - 外部表

第一节我们创建了一张employees表:

create table if not exists mydb.employees(name string, age integer) row format delimited fields terminated by ',';

使用describe formatted <table>命令查看它:

image-20240218134332749

发现它是MANAGED类型表,这引出了Spark中的两种表类型——MANAGEDEXTERNAL

Spark 中托管表和非托管表之间的区别

  • 托管/内部表(managed table):Spark 管理数据元数据。对于这些表,数据存储在仓库目录中,元数据存储在元存储中(包括数据库、表、视图、函数、分区信息)。当删除表时,仓库目录中的数据和元存储中的元数据都会被删除。目录中的表或数据都将不再存在。
  • 非托管/外部表(external table):Spark 仅处理元数据。 需要指定要存储表的位置或用于创建表的数据的目录。**当删除外部表时,仅删除元数据。**无法使用 Spark SQL 查询该表,因为它不在目录中。但是,实际的表数据保留在外部位置。

测试删除managed table

employees表的数据存储在HDFS下:

hdfs dfs -ls /user/spark/warehouse/mydb.db/employees/

image-20240218134654645

在spark SQL中删除这张表:

image-20240218134742670

此时不仅表的元数据被删除,原始的HDFS数据也一并被删除:

image-20240218134755213

创建External Table并测试

先下载测试csv到本地:

wget https://pingfan.s3.amazonaws.com/files/retailstore.csv

image-20240218135234793

将本地下载的csv文件上传到HDFS系统:

hadoop fs -mkdir /user/kongpingfan/
hadoop fs -mkdir /user/kongpingfan/data
hadoop fs -put retailstore.csv /user/kongpingfan/data
hadoop fs -ls /user/kongpingfan/data
hadoop fs -cat /user/kongpingfan/data/retailstore.csv

image-20240218135358299

创建外部表,注意关键字:external

use mydb;
create external table retailcust(age INT, salary FLOAT,gender String,country String, purchased String) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/kongpingfan/data/' TBLPROPERTIES ("skip.header.line.count"="1") ;

此时describe formatted <table>,注意到它的类型为EXTERNAL

image-20240218135624454

外部表一样可以正常的查询:

select * from retailcust;
select age, country from retailcust where salary > 20000;

image-20240218135705664

将表删除:

drop table retailcust;

检查HDFS中原始文件是否还在:

hdfs dfs -ls /user/kongpingfan/data/;

image-20240218135804097

总结

内部表也叫managed table,是spark在创建表时的默认表。

特点:在内部表被删除后,表的元数据和表数据都从HDFS中完全删除

适用场景:

  1. ETL数据清理是用内部表做中间表,清理时HDFS上的文件同步删除
  2. 在误删的情况下,易于恢复的数据,用内部表
  3. 统计分析时,不涉及数据共享数据的情况

外部表

特点:表中的数据在删除后仍然在HDFS中。

如果我们创建一个外部表,在删除表之后,只有与表相关的元数据被删除,而不会删除表的内容