第一节我们创建了一张employees
表:
create table if not exists mydb.employees(name string, age integer) row format delimited fields terminated by ',';
使用describe formatted <table>
命令查看它:
发现它是MANAGED
类型表,这引出了Spark中的两种表类型——MANAGED
与EXTERNAL
employees表的数据存储在HDFS下:
hdfs dfs -ls /user/spark/warehouse/mydb.db/employees/
在spark SQL中删除这张表:
此时不仅表的元数据被删除,原始的HDFS数据也一并被删除:
先下载测试csv到本地:
wget https://pingfan.s3.amazonaws.com/files/retailstore.csv
将本地下载的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
创建外部表,注意关键字: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
:
外部表一样可以正常的查询:
select * from retailcust;
select age, country from retailcust where salary > 20000;
将表删除:
drop table retailcust;
检查HDFS中原始文件是否还在:
hdfs dfs -ls /user/kongpingfan/data/;
内部表也叫managed table,是spark在创建表时的默认表。
特点:在内部表被删除后,表的元数据和表数据都从HDFS中完全删除
适用场景:
外部表
特点:表中的数据在删除后仍然在HDFS中。
如果我们创建一个外部表,在删除表之后,只有与表相关的元数据被删除,而不会删除表的内容。