Hive的介绍:Hive本质是一个翻译器,就是将Hql语句翻译成MapReduce,通过执行MapReduce来对海量数据仓库进行处理,表面上就是一个数据仓库能够查询与分析数据。
与传统的数据库比较,Hive的主要特点:1.分析离线存储数据,不具有实时性2.不支持事务,由于是历史数据没有必要去增删改3.不支持修改4.有很多数据的冗余保障了系统的健壮性。
Hive的5条重要结论:1.Hive中的数据库就是底层HDFS中的一个【库名.db】文件夹
2.Hive中的表就是底层HDFS中的库名文件夹下以表名为名字的文件夹
3.Hive中的数据就是HDFS中Hive表对应的文件夹下的文件
4.Hive中的Hql语句会转化为底层的MR来执行
5.Hive中默认的数据库对应的就是HDFS中/user/hive/warehouse目录
Hive的元数据库:存储着Hive的元数据信息具体就是库,表,列等数据之间的关系的描述,默认存放在derby数据库中。Derby数据库是一个单用户数据库,每当在一个新文件夹下启动Hive的时候就会新建一个新的存储元数据的文件夹出来,造成了很大的不便。所以我们一般使用mysql来存储元数据信息。
Hive元数据库中重要的表:
DBS:存储了Hive中库相关的信息,包括库编号、库名称、库所有者、库对应在HDFS中的存储位置
TBLS:存储了Hive中表相关的信息,包括表的编号、所属库的编号、表所有者、表名称、表类型
COLUMNS_V2:存储了Hive表中对应列的信息
SDS:存储Hive表中对应在HDFS中的存储位置,包括表的编号,存储位置
Hive中的内部表和外部表:内部表就是通过Hive直接创建一个表这时HDFS中也就会相应的创建一个文件,它是先有的表后有的数据,删除内部表,内部表删除元数据,对应的HDFS中表对应的文件夹和其中的数据也会被删除。外部表就是在真实开发中,很可能HDFS中已经有了数据,希望通过Hive直接使用这些数据作为表的内容,可以创建表关联这些数据,这种表就是外部表。先有数据后有表。外部表删除时只会删除元数据,HDFS中的数据不会删除。
创建外部表:create external table teacher (id int,name string) row format delimited fields terminated by ‘|’ location ‘/teacher’;
Hive中的分区表:Hive分区表的出现是为了提高查询效率,它的思想与mysql中的BTree索引很像,如果我们要查询分区内的数据我们提前就可以过滤很大一大批数据。由全表遍历变为选择性遍历。分区表就是在表对应的文件夹下再建立对应的字文件夹,在子文件夹下存放真实数据。
Hive中的分桶表:是一种更细粒度的数据分配方式,主要实现数据的抽样,方便进行数据测试。通过hash分桶算法将数据放在不同的桶中。分桶过程是在底层的MR中实现的。
Hive的函数:拥有内置函数,也可以自定义函数UDF. Hive还可以使用JDBC来连接
创建一个普通的java文件,导入hive相关的包
写一个类继承UDF
在类中编写一个公有的方法,方法名必须为evaluate,返回值和参数列表任意。
将写好的工程打jar包,上传到linux中
在hive中注册jar add jar /路径;
注册自定义函数 create temporary function 名字 as ‘所在的包.类名’;
调用临时函数 select 名字()
hive语法