基本命令:
1、 create database 创建数据库
2、Show databases; 显示数据库
3、desc 表明 显示表的详细情况/
4、desc formatted 显示的更详细
5、Drop database 删除
6、select current_database(); 可查看当前在哪个数据库
7、show create table 查看表结构
8、Hdfs dfs -put 文件名 /路劲 把文件上传到hdfs里,
9、load data inpath ‘/user/had/emplhr.txt’ into table emplhr; 加载数据到数据库(sql)
10、show table ‘关键字’ 相当于模糊查询
也可以通过 hdfs dfs -put ‘emp_basic’ /user/hive/warehouse/demo.db/emp_basic上传数据(hdfs)
建立外部表:需要关键字location 外部表可以保护数据,删除表的时候 数据不会被删除
当数据在内部表的时候,是完全由hive管理的,删除表的时候 数据也都会被删除
外部表第一个作用是处理元数据
当我们要做数据的内部转换或者清洗的时候,会建立内部表
共享元数据建立外部表
通过分区(partitions)查找 会提高hive的性能
用year month分区 其实就是文件夹 使用alter table
使用静态partition缺点 每次都要用alter table来增加partition
Hive是不支持动态分区的,需要设定set,默认是不打开的,会有危险性。会创建成千上万个
COMMENT //注释
ROW FORMAT DELIMITED //固定写法
Fields terminated by ‘|’ //按照‘|’来分隔
Collection items terminated by ‘,’ //数组是按照“,”来分隔的
Map keys terminated by “:” //map里的值是用:来分隔
Stored as textfile //存储文件文本
Location 路劲 外部表需要指定location 内部表不需要指定
创建分区表:
静态分区:
手动创建一个静态分区 不然是没有 分区列的
通过alter table ‘表名’add partition 来增加
Show partitions 查看分区
删除表分区
动态分区建立
为什么要使用动态分区呢,我们举个例子,假如中国有50个省,每个省有50个市,每个市都有100个区,那我们都要使用静态分区要使用多久才能搞完?所有我们要使用动态分区。
动态分区默认是没有开启。开启后默认是以严格模式执行的,在这种模式下需要至少一个分区字段是静态的。这有助于阻止因设计错误导致导致查询差生大量的分区。列如:用户可能错误使用时间戳作为分区表字段。然后导致每秒都对应一个分区!这样我们也可以采用相应的措施:
关闭严格分区模式
动态分区模式时是严格模式,也就是至少有一个静态分区。
set hive.exec.dynamic.partition.mode=nonstrict //分区模式,默认nostrict
set hive.exec.dynamic.partition=true //开启动态分区,默认true
set hive.exec.max.dynamic.partitions=1000 //最大动态分区数,默认1000
创建一个普通动态分区表:
create table if not exists zxz_5(
name string,
nid int,
phone string,
ntime date
)
partitioned by (year int,month int)
row format delimited
fields terminated by "|"
lines terminated by "\n"
stored as textfile;
现在还看不出来有什么不一样
insert overwrite table zxz_5 partition (year,month) select name,nid,phone,ntime,year(ntime) as year ,month(ntime) as month from zxz_dy;
zxz_5这个表里面存放着数据。
我们利用year,和month函数来获取ntime列的年和月来作为分区,这个是靠我们查询到数据来分区是不是很舒服
自动分区的格式:
分桶:使用分桶的时候必须要set hive.enforce.bucketing =true;
分区的方式是在表的后面加上分区列,实际是生成了不同的目录 (拆成了不同目录)
分桶对某一个列作为一个分桶条件 (把一个表拆成不同的文件)
把数据分成若干个子文件,重新组织,做数据关联的时候会非常快
方便抽样
分桶相当于一个动态分区,不能进行静态分区
分桶通常要考虑分成多少个子文件 ,一般都是128m
分桶和分区的区别不大,也是加关键字,关键的区别就是分桶的列和数据表里的列是一致的
Partition by 是我们凭空生成的
分桶必须用insert语句
Hive语句 侧视图
表达成两行 lateral view (可以让name变成多个)explode
a是lateral view的别名
Order by 案例
左连接案例
hive 聚合运算
聚合函数一定要配合group by进行使用,不然一直都是全局分组
最简单的分组查询 先聚合结果 在分组
Hiving 和where 有什么不同? hiving是最后执行
没有被聚合的 一定要出现在group by中
Row_number() over() 给行添加行号,over() 所有的行
窗口函数 Rank() 用来排序