数据仓库 Hive

本文介绍了Hive作为基于Hadoop的数据仓库工具的基本概念、特点及其安装配置过程,并深入探讨了Hive中的各种表类型(包括内部表、外部表、分区表和分桶表)的应用场景与实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据仓库 Hive

  • 数据仓库

    • 是什么?

      集成化的数据分析平台
      
    • 如何由来?

      为了分析数据  分析的结果支持企业的决策
      
    • 特点

      本身不生产数据 也不消费数据  数据分析的平台
      
    • 4个特性

      • 面向主题性

        主题是一个抽象概念 数据综合体 跟你分析的需求相关
        
      • 集成性

        确定分析的主题之后 寻找跟主题相关的各个数据源数据 经过抽取转化加载(ETL)最终把数据变成格式统一干净规整的数据 填充数据仓库的主题下面
        
      • 非易失性

        数仓是数据分析的平台 不是数据创造的平台  分析数据的规律 而不是修改创造数据的规律
        数仓的数据都是已经产生的历史数据 已经是客观的事实
        
      • 时变性

        数仓的数据随着时间成周期性变化 分析的频率相关 一年一分析 一季度一分析 一天一分析
        
      • OLTP和OLAP区别

        oltp  t事务 联机事务处理 面向事务面向业务  也就是我们所说的关系型数据库(RDBMS):mysql   
             oracle ;注意不是非关系型数据库(noSQL):redis  mongodb
             
        olap  a分析  联机分析处理 面向分析  也就是我们所说的数据仓库  Apache Hive 、Apache 
              Impala     
        
      • Q:数据仓库是大型数据库?Apache hive是用来取代mysql?

        数仓绝不是为了取代数据库而出现 为了分析而出现
        数据库必须要有 数仓根据公司是否需要开展分析而决定是否设定。
        
      • 数据仓库的分层架构

        因为数仓本身不生产数据不消费数据按照数据的流入流出进行分层

        • ODS:临时存储层 一般不用于直接开展数据分析 该层的数据来自于各个不同数据源 之间可能会存在着差异
        • DW:数据仓库层 也称之为细节层 其数据来自于ods层经过ETL而来。当中的数据呈现着主题的特性 格式一般都是统一规则干净清晰的
        • DA数据应用层 最终消费使用数据 其数据来自于DW
      • 为什么要数据仓库分层?好处是?

        • 解耦合 分布执行 降低出问题的风险
        • 用空间换时间 用多步换取最终使用的数据的高效性。

Apache Hive

  • 如何理解hive是基于hadoop的数仓?

    • 数据存储的能力 ---->Hadoop HDFS
    • 数据分析的能力----->Hadoop MapReduce

    把一份结构化的数据映射成为一张表 提供了用户编写sql hive转换成为mr处理数据的能力。

  • hive的安装部署

    • metadata metastore

      • metadata 元数据 解释性数据 hive元数据指描述表和文件的之间映射关系的数据
      • metastore 元数据服务 提供了一个统一的服务接口 便于各个客户端通过metastore访问元数据
    • metastore的三种部署模式

      • 内嵌模式

        • 特点: 使用内置的derby来存储元数据 元数据metastore不需要配置和启动
        • 使用简单:bin/hive 启动使用
        • 缺点:元数据无法共享 跟启动路径相关
      • 本地模式

        • 特点:使用第三方数据库如mysql俩存储元数据 metastore服务不需要单独配置启动

          每启动一个hive的服务 都会内置一个metastore服务

        • 配置:

          根据 hive.metastore.uris  的值是否为空来判断是否为本地模式
          
        • 大前提:必须安装好mysql 确保mysql正常启动运行 并且具备访问的权限

          第一步:安装mysql依赖
          yum install mysql mysql-server mysql-devel
          
          第二步:初始化mysql 设置root的密码 权限
          /etc/init.d/mysqld start  --首次启动mysql
          
          mysql --进入mysql命令行
          
          mysql>; USE mysql;  --切换mysql数据库
          mysql>; UPDATE user SET Password=PASSWORD('hadoop') WHERE user='root'; 
          mysql>; FLUSH PRIVILEGES;  --设置mysql root密码
          mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'hadoop' WITH GRANT OPTION; --授予root用户权限
          mysql>; FLUSH PRIVILEGES;  --刷新权限
          
          
          第三步:
          service mysqld start|stop  单次启动关闭mysql
          chkconfig mysqld on  设置为开机自启动
          
        • hive的本地模式具体配置

          第一个配置文件:
          hive-env.sh  
          export HADOOP_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
          
          第二个配置文件:
          vim hive-site.xml
          <configuration>
          	<property>
          		<name>javax.jdo.option.ConnectionURL</name>
          		<value>jdbc:mysql://node-1:3306/hive?createDatabaseIfNotExist=true</value>
          	</property>
          	
          	<property>
          		<name>javax.jdo.option.ConnectionDriverName</name>
          		<value>com.mysql.jdbc.Driver</value>
          	</property>
          	
          	<property>
          		<name>javax.jdo.option.ConnectionUserName</name>
          		<value>root</value>
          	</property>
          
          	<property>
          		<name>javax.jdo.option.ConnectionPassword</name>
          		<value>hadoop</value>
          	</property>
          </configuration>
          
          第三步:把mysql jdbc驱动包放入hive安装包lib文件夹下 
          
        • 弊端:

          • 每个客户端都需要知道mysql的密码
          • 每启动一个hive服务 都会内置一个metastore服务 浪费资源
      • 远程模式(推荐

        • 特点:使用第三方mysql来存储元数据 需要单独配置启动metastore服务

        • 配置:在本地模式的基础上添加一个参数

          hive.metastore.uris
          
          <property>
              <name>hive.metastore.uris</name>
              <value>thrift://node-1:9083</value>
          </property>
          
        • 启动:必须首先手动单独启动metastore服务 再使用hive客户端进行连接

          bin/hive --service metastore
          
        • 使用:

          可以在任何一台机器上 使用bin/hive进行连接 只需要指定metastore地址就可以了。

    • hive的第一代客户端和第二代客户端

      • 第一代 bin/hive 反对 过时 不赞成使用 还可以偷偷使用

      • 第二代 bin/beeline 需要配合hiveserve2服务使用 不直接使用metastore

        • 配置:hive-site.xml

                  <property>
                          <name>hive.server2.thrift.bind.host</name>
                          <value>node-1</value>
                  </property>
          
        • 启动顺序

          先启动hadoop 然后启动mysql

          启动metastore服务 最后启动hiveserver2服务。

          最后使用beeline客户端进行连接。

          • 前台启动

            /export/servers/hive/bin/hive --service metastore
            /export/servers/hive/bin/hive --service hiveserver2
            
          • 后台启动

            nohup command & 把命令挂起后台执行
            
            nohup /export/servers/hive/bin/hive --service metastore &
            nohup /export/servers/hive/bin/hive --service hiveserver2 &
            

  • 如何把hdfs上的一个结构化数据文件 映射成为hive的一张表?

    • 文件的路径好像有规律 难道要把结构化数据放置在这个路径下? 不一定 外部表指定文件路径

      数据库.表  ------->/user/hive/warehouse/数据库名.db/表名
      
    • 建表的字段顺序和类型一定要和文件一致。一定

      create table t_3(id int,name int,age string) row format delimited fields terminated by ",";
      

      如果类型不一致 hive会尝试转换 不保证转换成功 如果成功就显示 如果失败就显示null

    • 难道是分隔符需要指定? 不一定 默认分隔符也可以

      create table t_1(id int,name string,age int);
      create table t_2(id int,name string,age int) row format delimited fields terminated by ",";
      

Hive DDl

  • 数据类型

    • 要求:字段的类型和顺序要和结构化文件保持一致 hive会尝试转换 不保证转换成功 如果成功就显示 如果失败就显示null
    • hive除了支持sql类型 还支持java类型 大小写不敏感
    • hive除了支持基本类型 还支持复合类型(map array) 针对复合类型要跟分隔符指定有关
  • hive读取数据映射的机制

    • 首先调用Inputformat进行读取数据,默认TextInputFormat(一行一行读)
    • 然后调用SerDe类进行数据切割,默认LazySimpleSerDe根据指定分隔符进行数据切割
  • 分隔符的指定

    • 语法格式

      ROW FORMAT DELIMITED|SERDE
      
      ROW FORMAT:表明开始指定分隔符 如果不写 使用默认的分隔符来切割
      DELIMITED:使用内置默认的类来进行数据切割  默认LazySimpleSerDe
      SERDE:表示使用其他的类来进行数据的切割 
      
      [FIELDS TERMINATED BY char]  指定字段之间的分隔符
      [COLLECTION ITEMS TERMINATED BY char] 指定集合元素之间分隔符
      [MAP KEYS TERMINATED BY char]  指定map kv之间的分隔符
      [LINES TERMINATED BY char] |  指定换行符\r\n
      
    • 默认分割符

      • 不可见分隔符
      • 代码层面 \001
      • vim编辑器 Ctrl+v 然后 Ctrl+a
      • 如果建表的时候没有指定分隔符 此时数据文件中恰好也是默认分隔符 不指定也可以映射成功
  • hive内部表、外部表

    • 内部表:表对应的结构化数据文件位置 都位于hive指定默认的路径下

      hdfs://node-1:8020/user/hive/warehouse/数据库名.db/表名
      
    • 外部表:表对应的结构化数据文件位置 可以位于hdfs任意路径 需要location指定清楚

    • 语法:

      内部表
      create table student(Sno int,Sname string,Sex string,Sage int,Sdept string) row format delimited fields terminated by ',';
      建外部表
      create external table student_ext(Sno int,Sname string,Sex string,Sage int,Sdept string) row format delimited fields terminated by ',' location '/stu';
      
    • 区别

      • 内部表在删除drop表的时候 hive中表的信息连同hdfs的数据一起被删除
      • 外部表在删除drop表的时候 只删除hive中定义表的信息 hdfs文件不会被删除
  • 分区表

    • 概念的引入

      在涉及查询操作的时候 如果表对应的文件有多个 需要进行全表扫描  性能不高 如何优化?
      
    • 分区表的创建

      create table t_user_p (id int, name string,country string) row format delimited fields terminated by "," partitioned by (country string); --错误
      --语法树上面的语句 是有顺序的 按照语法树的顺序编写
      
      create table t_user_p (id int, name string,country string) partitioned by (country string) row format delimited fields terminated by ","; --报错
      --分区的字段不能是表中已经存在的字段
      
      create table t_user_p (id int, name string,country string) partitioned by (guojia string) row format delimited fields terminated by ","; 
      
    • 分区表的数据加载

      --猜想加载数据的方式
       hadoop fs -put china.txt /user/hive/warehouse/itcast.db/t_user_p --没有结果 错误
       
      -- 使用load 命令进行数据加载  加载的时候指定分区的信息
      load data local inpath '/root/hivedata/china.txt' into table t_user_p partition(guojia='zhongguo');
      
      load data local inpath '/root/hivedata/usa.txt' into table t_user_p partition(guojia='meiguo');
      
    • 分区表的使用

      --不使用分区查询
      select * from t_user_p where country = "china";  --全表的扫描
      --使用分区查询
      select * from t_user_p where guojia = "zhongguo"; --查询指定的分区 减少全表的扫描
      
    • 分区表的注意事项

      • 分区表是一种优化表 不是必须创建的表 优化了查询时候全表扫描的数据量

      • 分区的字段不能是表中已经存在的字段。分区字段是一个虚拟的字段 最终也会显示查询结果上

        如果和表中的字段重复 就会产生歧义。

      • 分区的字段是一个虚拟的字段 其值不位于文件中 来自于加载数据的指定

      • 分区表最终显示格式就是在表的文件夹下面以子文件夹的形式存在

      • 企业中,常见的分区字段

        地域:国家  省 市
        时间:年 月 日
        
  • 分桶表(分簇表)

    • 语法格式

      语法:clustered by xxx into N buckets
      
      从字面理解:根据xxx分成几个桶
      通俗解释:把数据文件根据某个字段分为几个部分。
      
      cluster:群 从 簇
      bucket :桶
      
      根据谁分?  clustered by xxx  xxx就是分的字段
      分成几个部分? N buckets N就表示分成几个部分
      如何分?
      	如果xxx字段是字符串类型   xxx.hashcode %  N   余数为几就去哪个部分
      	如果xxx字段是数值类型     xxx  %  N  余数为几就去哪个部分
      
    • 分桶表的创建

      create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string)
      clustered by(Sno) 
      into 4 buckets
      row format delimited
      fields terminated by ',';
      
    • 分桶表的数据加载

      --猜想方式1 直接put
      hadoop fs -put students.txt /user/hive/warehouse/itcast.db/stu_buck --错误 文件没分开
      
      --猜想方式2  load
      load data local inpath '/root/hivedata/students.txt' into table stu_buck cluster(Sno); --报错  语法根本就不支持
      
      --真正导入分桶表数据的方式  间接导入
      set hive.enforce.bucketing = true;  --开启分桶的功能
      set mapreduce.job.reduces=4;        --指定分桶的个数 和建表的时候保持一致
      
      --1、创建一个临时的普通表
      create table student(Sno int,Sname string,Sex string,Sage int,Sdept string)
      row format delimited
      fields terminated by ',';
      
      --2、把结构化的数据文件加载到临时普通表中
      hadoop fs -put students.txt /user/hive/warehouse/itcast.db/student
      
      --3、通过分桶查询把数据插入分桶表中 insert+select
      insert overwrite table stu_buck select * from student cluster by(Sno);
      
    • 分桶表的使用

      直接和正常表使用一样 只不过底层文件被分开了
      
    • 分桶表的总结

      • 最大的意义:优化join查询的时候笛卡尔积的数量 优化表
      • 分桶表是一种优化的表 建表的时候可选
      • 分桶的字段必须是表中已经存在的字段
      • 分桶的功能默认没有开启的 需要手动设置开启
      • 分桶的最终形式来看 就是原来完整的文件被按照规则分成了若干个部分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值