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完成,那么你应该创建表,否则使用外部表!