export tb_name to HDFS_PATH
如果数据是普通的文本数据 在shell客户端使用get下载数据
hdfs dfs -get /tb_name/file
hive端:
hive> dfs -get /文件
不开启hive终端 执行SQL语句
hive -e "use dafault; select * from tb_user ";
hive -e "select * from tb_user " >> log.tb 将SQL执行结果追加到log.tb文件中
执行SQL脚本
[root@linux01 ~]# vi test.sql
use default;
select * from tb_log ;
[root@linux01 ~]# hive -f test.sql
将查询结果保存到本地目录中
insert overwrite local directory "/root/"
select * from tb_user;
将查询结果保存到表中
insert into tb_log_res select count(1),avg(age) from tb_log ;
分区表 : 将表的数据以查询维度为依据分文件夹管理 , 当根据这个维度查询的时候减少数据的检索范围。比如有一个log表,所有的日志数据在log表目录下 ,假如想查20201130日的数据 , 只能遍历所有的数据。有了分区表以后 数据就可以以日期为维度,为文件夹存储对应日期的数据。假如想查20201130日的数据直接从对应的文件夹下读取数据 。
分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。
文件中存储的是指定规则的数据 。比如 a.log中存储的就是20201130的数据,直接创建一个分区叫20201130 ,将数据直接load到目录下。
create table tb_partition_log(
log_id string ,
url string ,
ct string
)
partitioned by(dt string) -- 指定分区字段
row format delimited fields terminated by ',' ;
将静态数据导入到指定的分区中
load data local inpath "/root/log/20201128.log" into table tb_partition_log partition(dt='20201128') ;
load data local inpath "/data/log/20201129.log" into table tb_partition_log partition(dt='20201129') ;
此时会在表目录下生成两个文件夹,名字就为dt=20201128 ,dt=20201129
查询某天的日志,即查询某个分区文件夹下的日志文件
select * from tb_partition_log where dt='20201128';
结果如下:
+--------------------------+-----------------------+----------------------+----------------------+
| tb_partition_log.log_id | tb_partition_log.url | tb_partition_log.ct | tb_partition_log.dt |
+--------------------------+-----------------------+----------------------+----------------------+
| 1 | url1 | 20201128 | 20201128 |
| 2 | url2 | 20201128 | 20201128 |
| 3 | url3 | 20201128 | 20201128 |
| 4 | url4 | 20201128 | 20201128 |
| 5 | url5 | 20201128 | 20201128 |
| 6 | url6 | 20201128 | 20201128 |
| 7 | url7 | 20201128 | 20201128 |
+--------------------------+-----------------------+----------------------+----------------------+
create table tb_partition_log2(
log_id string ,
url string ,
ct string
)
partitioned by(m string , d string) -- 指定分区字段 2个
row format delimited fields terminated by ',' ;
导入数据
load data local inpath "/root/log/20201128.log" into table tb_partition_log2 partition(m='202011' , d='28') ;
load data local inpath "/data/log/20201129.log" into table tb_partition_log2 partition(m='202011' , d='29') ;
load data local inpath "/data/log/20201010.log" into table tb_partition_log2 partition(m='202010' , d='10') ;
按照某个字段自动的将数据加载到指定的分区中
有一个表数据如下:
select * from tb_user_log ;
+------------------+-------------------+-------------------+
| tb_user_log.uid | tb_user_log.name | tb_user_log.city |
+------------------+-------------------+-------------------+
| 1 | lisi | Shanghai |
| 2 | ycy | Shanghai |
| 3 | ym | Beijing |
| 4 | Yangzi | Beijing |
| 5 | Yangguo | shenzhen |
| 6 | mayun | shenzhen |
| 7 | mbg | Shanghai |
| 8 | marong | shenzhen |
+------------------+-------------------+-------------------+
要求根据城市分区
1)创建一个分区表
CREATE TABLE tb_dynamic_partition_user_log(
id int ,
name string ,
city string
)
partitioned by(p_city string) ;
2)开启动态分区
set hive.exec.dynamic.partition=true ;
set hive.exec.dynamic.partition.mode=nonstrick; --可以从普通表导入到分区表
想要永久生效,需要设置在hive—site.xml文件中
3)通过insert ..select... 方式导入数据
insert into tb_dynamic_partition_user_log partition(p_city)
select uid,name,city,city as p_city from tb_user_log;
在HDFS中表目录下生成三个文件夹:
p_city=Beijing
p_city=Shanghai
p_city=shenzhen
添加分区
alter table dept_partition add partition(month=‘201706’) ;
alter table dept_partition add partition(month=‘201705’) partition(month=‘201704’);
删除分区
alter table dept_partition drop partition(month=‘201704’);
查看分区表有多少分区
show partitions dept_partition;
查看分区表结构
desc formatted dept_partition;
show databases; 显示所有数据库
use db_name(数据库名); 切换数据库
select current_database(); 查看当前使用数据库