1. 将数据上传至 hdfs
hdfs dfs -put stocks /user/bigdata
2. 创建外部表
create external table if not exists stocks_external(
ymd date,
price_open float,
price_high float,
price_low float,
price_close float,
volume int,
price_adj_close float
)
partitioned by (exchanger string,symbol string)
row format delimited fields terminated by ','
location '/user/bigdata/stocks';
3. 载入数据
alter table stocks_external add partition(exchanger="NASDAQ", symbol="AAPL")
location '/user/bigdata/stocks/NASDAQ/AAPL';
alter table stocks_external add partition(exchanger="NASDAQ", symbol="INTC")
location '/user/bigdata/stocks/NASDAQ/INTC';
alter table stocks_external add partition(exchanger="NYSE", symbol="IBM")
location '/user/bigdata/stocks/NYSE/IBM';
alter table stocks_external add partition(exchanger="NYSE", symbol="GE")
location '/user/bigdata/stocks/NYSE/GE';
-- 展示分区信息
show partitions stocks_external;
4. 查询表
select * from stocks_external where exchanger = 'NASDAQ' and symbol = 'AAPL' limit 10;
select ymd, price_close from stocks_external where exchanger = 'NASDAQ' and symbol = 'AAPL' limit 10;
select exchanger, symbol, count(*) from stocks_external group by exchanger,symbol;
select exchanger, symbol, max(price_high) from stocks_external group by exchanger, symbol;
5. 删除表
-- 删除外部表
drop table stocks_external;
-- 查看 hdfs 上的数据,删除外部表是只删除表的元数据,不删除表的实际数据,这点和
hdfs dfs -ls /user/bigdata
最后归纳一下Hive中表与外部表的区别:
1、在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!而表则不一样;
2、在删除表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!
那么,应该如何选择使用哪种表呢?在大多数情况没有太多的区别,因此选择只是个人喜好的问题。但是作为一个经验,如果所有处理都需要由Hive完成,那么你应该创建表,否则使用外部表!