11.spark学习之旅之hive(五)

1. hive概述

1.1. 简介

  • Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
  • 主要用途:用来做离线数据分析,比直接用mapreduce开发效率更高。

1.2. 为什么要使用hive

  • 操作接口采用类SQL语法,提供快速开发的能力,避免了去写MapReduce,减少开发人员的学习成本,功能扩展很方便。

1.3. hive的特点

  • 可扩展 – hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
  • 延展性 – hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
  • 容错 – 良好的容错性,节点出现问题SQL仍可完成执行。

1.4. 架构

1.5. hive的基本操作

1.6. hive的数据存储

  • Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可支持Text,SequenceFile,ParquetFile,RCFILE等)SequenceFile是hadoop中的一种文件格式:文件内容是以序列化的kv对象来组织的
  • 只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据
  • Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket
    • db:在hdfs中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
    • table:在hdfs中表现所属db目录下一个文件夹
    • external table:与table类似,不过其数据存放位置可以在任意指定路径
    • partition:在hdfs中表现为table目录下的子目录 注意这里分区的概念
    • bucket:在hdfs中表现为同一个表目录下根据hash散列之后的多个文件

2. hive的安装部署

  • 解压
  • 修改配置文件 百度云提取码;rbnz
  • 加载驱动包
    • 安装hive和mysq/postgresql完成后,将mysql/postgresql的连接jar包拷贝到$HIVE_HOME/lib目录下
  • Jline包版本不一致的问题,需要拷贝hive的lib目录中jline.2.12.jar的jar包替换掉hadoop中的 /home/hadoop/app/hadoop-2.6.4/share/hadoop/yarn/lib/jline-0.9.94.jar

2.1. hive为什么要启用Metastore?

2.2. hive集群搭建(主要留意配置文件)

3. hive的基本操作

3.1. 数据定义语言DDL

3.2. 数据操纵语言DML

  • Load操作
    在这里插入图片描述
  • Insert(将查询的结果插入hive表)
    在这里插入图片描述
  • 导出数据
    在这里插入图片描述

3.3. 数据查询语言DQL

在这里插入图片描述

3.4. 桶表的相关案例

  • 对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

  • 把表(或者分区)组织成桶(Bucket)有两个理由:

    • 获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
    • 使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
  • 多表关联应用
    在这里插入图片描述

  • 桶表抽样查询
    在这里插入图片描述

    扫描二维码关注公众号,回复: 9916534 查看本文章
  • Hive 区分cluster by、distribute by + sort by、order by以及创建表带有clustered by和sort by

3.5. Hive join(只支持等值链接,和sql用法类似)

在这里插入图片描述

4. hive的集合类型

集合类型主要包括:array,map,struct等,hive的特性支持集合类型,这特性是关系型数据库所不支持的,利用好集合类型可以有效提升SQL的查询速率.
在这里插入图片描述

5. hive 严格模式

hive提供了一个严格模式,可以防止用户执行那些可能产生意想不到的不好的效果的查询。即某些查询在严格模式下无法执行。通过设置hive.mapred.mode的值为strict,可以禁止3中类型的查询。
在这里插入图片描述

6. hive Shell 参数

6.1. hive命令行

在这里插入图片描述

6.2. hive参数配置方式

在这里插入图片描述

7. hive函数

7.1. 内置函数

7.2. hive自定义函数和Transform

在这里插入图片描述

8. Hive 实战–累计报表(面试套路)

  • 要求输出每个客户在每个月的总访问次数,以及在当前月份之前所有月份的累计访问次数
  • 创建表
    create table t_access_times(username string,month string,salary int) row format delimited fields terminated by ‘,’;
  • 加载数据
    load data local inpath ‘/root/hivedata/t_access_times.dat’ into table t_access_times;
    A,2015-01,5
    A,2015-01,15
    B,2015-01,5
    A,2015-01,8
    B,2015-01,25
    A,2015-01,5
    A,2015-02,4
    A,2015-02,6
    B,2015-02,10
    B,2015-02,5
    
    • 第一步,先求个用户的月访问次数
      select username, month, sum(count) as count from t_access_time group by username, month;
      在这里插入图片描述
    • 第二步,将月总访问表 自己连接 自己
      select A.,B. FROM
      (select username,month,sum(count) as count from t_access_time group by username,month) A
      inner join
      (select username,month,sum(count) as count from t_access_time group by username,month) B
      on
      A.username=B.username
      where B.month <= A.month
      在这里插入图片描述
    • 第三步,从上一步的结果中
      进行分组查询,分组的字段是a.username a.month求月累计值: 将b.month <= a.month的所有b.salary求和即可
      select A.username,A.month,max(A.count) as count,sum(B.count) as accumulate
      from
      (select username,month,sum(count) as count from t_access_time group by username,month) A
      inner join
      (select username,month,sum(count) as count from t_access_time group by username,month) B
      on
      A.username=B.username
      where B.month <= A.month
      group by A.username,A.month
      order by A.username,A.month;
      在这里插入图片描述

9. 好学而不勤问非真好学者

发布了85 篇原创文章 · 获赞 12 · 访问量 3726

猜你喜欢

转载自blog.csdn.net/fanjianhai/article/details/104409128