1.hive是什么
  • 在hadoop上处理结构化数据的数据仓库,采用sql方式操作
  • hive元数据存储在mysql上,也就是描述hive表的属性信息存放在mysql上;数据存放在hdfs上
  • 不是关系型数据库,不是在线处理,不适合实时查询
  • hive利用hdfs存储数据,利用mapreduce查询数据

2.hive使用

  • 启动hive时候要启动hdfs
  • 可以通过远程连接,访问hive
    • 先启动hiveserver2服务器,端口是10000
      命令:hive --service hiveserver2 &

(上边命令相当于启动了hiveservice服务,直接输入hive 相当于只启动了hive cli服务也就是命令行)

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
    • 输入beeline进入beeline命令行 (beeline也是hive的一个服务,是支持并发访问hiverserver的cli)
    • 通过beeline连接到hiveserver2
      直接beeline启动beeline(连接beeline之后就支持并发访问了)
      连接命令!connect jdbc:hive2://localhost:10000/mydb2
    • 连接之后操作就和mysql一样了
3.hive中的表
  • 托管表(内部表):删除表时,数据也删除
  • 外部表:删除表时,数据不删除
  • 在hive中默认创建托管表
4.hive命令汇总
  (4.1)建表:
create external table if not exists t2(id int,name string,age int) comment 'xx' row format delimited fields terminated by',' stored as textfile;

  (4.2)将本地文件上传到hive表中(前提是表结构和文本数据一致)

load data local inpath '[本地目录]'
into table t2;

   该命令就是将本地文件或者hadoop上的文件移动到hive工作目录下,hive工作目录也是在hadoop上的,只不过目录不同。

   (4.3)复制表

    带表结构和数据:create table t4 as select * from t2;

    只有表结构,没有数据:create table t3 like t2;

  (4.4)导出表

export table t2 to '[导出路径]';

  注意这里的输出目录路径不是本地目录,而是在hdfs上的目录

5.关于hive查询语句是否转成mr计算(个人理解)
(5.1) select * from t where age > 3;
这条语句不需要转换成mr,因为在每个分区找到age>3再输出就可以了
(5.2)select count(*) from t;
这条语句需要转换成mr,因为不做汇集就不能计算出总数
6
.关于hive的分区表
(6.1) hive的优化手段之一就是建立分区表,分区表是目录,可以限定扫描一定目录下的数据,所以可以减少时间
     比如最近一周的日志,最近一个月的销量,都可以建立单独的分区表
(6.2) 分区表在表中以字段形式显示,并且在查询的时候可以使用该字段(实际上没有该字段),
   而在存储时候是一个目录,所以表面上是指定查找某个字段的值,实际上是在某个目录下查找,缩小了查找范围
(6.3) 分区表在目录的层次上进行过滤
(6.4) 分区表在逻辑上是添加了字段,在物理上是将数据存放在不同目录下
7
.关于hive桶表
(7.1) 桶表的作用就是将同一个表的数据存储到不同文件当中,比如使用id进行hash存储
(7.2) 这样做的好处就是如果按照id查询,那么就可以按照桶,也就是文件进行筛选
比如查询id=10000的记录,桶表按照1000划分,那么直接查第1个桶(文件)就可以
(7.3) 桶表在文件的层次上进行过滤
(7.4) 直接进行load data local inpath 'xx' into table t;
不会进行分桶,要使用查询插入,比如insert into t1 select xx from t2;
(7.5) 如果增加一个记录,不会在原来的桶文件中追加内容,而是在原来的文件桶中添加一个copy
比如:原来的是/user/hive/warehouse/mydb1_31.db/employees_bucket/000000_0
添加一个新数据,如果在一个桶,那么会增加一个
/user/hive/warehouse/mydb1_31.db/employees_bucket/000000_0_copy_1
(7.6)桶的大小如何划分:尽量保证一个桶可以装入两个hdfs数据块的数据量
     (7.7)简单说可以提高查询效率,两个表进行join操作,而每个表都被分为4个桶,那么进行join时候,
      1号桶和1号桶join,2号桶和2号桶join

8
.distribute by,sort by,...
8.1 distribute by的作用就是将每个公司的股票记录都分到每个公司的reduce端中进行排序
8.2 hive中仍然有group by语句和having语句
8.3 order by是全局排序,sort by是在每个reduce端进行排序
两者会在reduce作业个数大于1的时候有区别,此时sort by整体上并没有实现排序
8.4 cluster by 等于distribute by + sort by
cluster by 采用的排序方式也是升序排序
9
.动态分区
  (9.1)严格模式和非严格模式
严格模式:插入记录或者查询时至少指定一个静态分区
相反,非严格模式插入记录或者查询时可以不指定静态分区
  (9.2)
动态分区:分区表的分区(也就是列)是可以动态增加的
  (9.3)
举例
insert into table employees partition(country,state)
select ...,se.cnty,se.st from
staged employees se where se.cnty = 'us';
也就是在插入时候不指定分区,分区的具体信息根据记录来确定
如果所有的都可以动态指定,那就是非严格模式
如果必须要指定至少一个分区,那就是严格模式
  (9.4)
插入记录过程也可以看作是创建文件夹的过程
10.一句话完成wordcount
  
(10.1).原数据
leetcode is great
great is leetcode
is great leetcode
great leetcode is
  (10.2)
.select split(line,' ') from wordcount;
split可以将line这列的每个记录用空格分解成一个数组
["leetcode","is","great"]
["great","is","leetcode"]
["is","great","leetcode"]
["great","leetcode","is"]
  
(10.3).select explode(split(line,' ')) from wordcount;
explode可以将多个数组中的元素取出来,变成一列内容
leetcode
is
great
great
is
leetcode
is
great
leetcode
great
leetcode
is
  
(10.4).select t.word,count(*) c from ((select explode(split(line,' '))
as word from wordcount) t) group by t.word order by c desc ;
分为几部分:
1.select explode(split(line,' ')将该列定义别名word
2.(select explode(split(line,' ')) as word from wordcount) t 将该表定义成别名t
3.这就变成select t.word,count(*) c from t group by t.word order by c desc;
11.视图
视图只是对语句的封装,并不存在真正的表(虽然执行过后会有类似表结构的存在)
在hdfs上没有存放视图,在mysql中存放,说明视图只是逻辑上的,不是物理上的
12.函数
(12.1) 表生成函数就是一行输入,多行输出
例如select explode(array(1,2,3));
(12.2) 自定义函数的@Description中的内容就是在命令行下执行describe function xxx;显示的内容
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄