11_hive二

本文深入探讨了Hive在大数据分析中的作用,重点讲解了分桶表的概念和作用,以及Hive的DDL操作,包括修改表结构、数据导入导出、静态和动态分区。此外,还介绍了基本查询语法如分组、连接和排序,以及Hive客户端的JDBC操作和可视化工具dbeaver的使用方法。
摘要由CSDN通过智能技术生成

大数据分析利器之hive

 

1、分桶表   知道 
2、修改表结构  了解一下
3、数据导入几种方式 掌握
4、数据导出  了解
5、hive的静态分区以及动态分区   知道
6、基本的查询语法  掌握
7、jdbc操作  了解
8、dbbeaver使用 了解

 

 

目录

目录

大数据分析利器之hive

 

一、hive的分桶表

1.1、分桶表概述

1.2、案例演示

二、Hive表的DDL操作

2.1、Hive修改表结构

2.1.1、 修改表的名称

2.2 表的结构信息

2.3 增加/修改/替换列信息

三、Hive数据导入

3.1、直接向表中插入数据(强烈不推荐使用)

3.2、通过load方式加载数据(必须掌握)

3.3、通过查询方式加载数据(必须掌握)

3.4、查询语句中创建表并加载数据(as select)

3.5、创建表时通过location指定加载数据路径

四、Hive数据导出

4.1 insert 导出

 

4.2、 Hive Shell 命令导出

4.3、export导出到HDFS上

五、hive的静态分区和动态分区

5.1 静态分区

5.2 动态分区

六、hive的基本查询语法

6.1、基本查询

1.1 全表和特定列查询

1.2 列起别名

1.3 常用函数 count max min sum avg 

1.4 limit 语句

1.5 where 语句

1.6 算术运算符

1.7 比较运算符

1.8 逻辑运算符

6.2、分组

1、Group By 语句

2、 Having语句

6.3、join语句

3.1 等值 join

3.2 表的别名

6.4、连接

6.4.1、内连接 inner join

6.4.2、 左外连接 left outer join

6.4.5、右外连接 right outer join

6.4.6、满外连接 full outer join

6.4.7、多表连接

6.5、排序

6.5.1、order by 全局排序

6.5.2、Sort By 局部排序

6.5.3、distribute by 分区排序

6.5.4、cluster by

七、hive客户端jdbc操作

第一步:启动hiveserver2的服务端

第二步:引入依赖

第三步:代码开发

八、hive的可视化工具dbeaver介绍以及使用

8.1、dbeaver的基本介绍

8.2、dbeaver的下载安装

8.3、dbeaver的安装与使用

 



一、hive的分桶表

分区表是分文件夹 

分桶表:直接对数据进行分桶,分成多个文件,每个文件里面保存部分数据,到时候如果需要获取数据的时候,可以直接从对应的文件里面获取即可
可以过滤掉大量不相关的文件,提高查询效率
分桶表就是分文件,将一个大的文件分成多个小的文件,提高查询效率

1.1、分桶表概述

 

  • 分桶是相对分区进行更细粒度的划分。

  • ==分桶将整个数据内容安装某列属性值取hash值进行区分,具有相同hash值的数据进入到同一个文件中==

    • 比如按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。

      • 取模结果为==0==的数据记录存放到一个文件

      • 取模结果为==1==的数据记录存放到一个文件

      • 取模结果为==2==的数据记录存放到一个文件

      • 取模结果为==3==的数据记录存放到一个文件

  • ==分桶的作用==

    • 1、取样sampling更高效。没有分区的话需要扫描整个数据集。

    • 2、提升某些查询操作效率,例如map side join

 

 

  • 分桶后不是加大了hadoop的存储量? hadoop不是对少数的大文件最有效吗? 

    • 实际工作当中你需要控制桶的数量,尽量保证每个桶里面的数据量比较接近128M
      1280M的文件==》划分10个桶比较合理  set mapreduce.job.reduces=10;

  • 设置reduce个数为3个分4桶会怎么样   ==》会报错  reducetask的个数  >=  桶的个数

  • 这里分桶表不可以直接load么  ?

    • 不行,直接load是一整个文件,需要将文件打散,需要使用mr的程序
      直接load没有执行mr的程序没法打散

  • 数据文件太大会导致什么样的情况呢,除了查询慢还有什么么   查询比较慢

  • 如果reduce个数大于桶数会出现空文件么  会出现

  • 修改桶数后还需要什么操作呢?会自动重新分桶吗 
    需要重新insert  overwrite select  操作

  • 分桶表的数据只能insert吗    对对对

  • load 操作底层不是 MR操作? 

    • 不是的  只是将文件移动到hdfs对应的文件夹下面去了

  • 每次插入表都是新增一个文件,为什么不直接在一个文件下追加呢 

    • hadoop没有提供mr追加的操作
      追加会产生什么问题??? 涉及到block块的操作,更改block块的内容涉及到元数据更改==》非常麻烦

  • 是不是创建表并没有与文件形成映射,加载数据之后映射才会形成? 
    不是的  创建表的时候已经指定了hdfs文件存储的位置,你只需要通过load将文件移动到hdfs指定的位置即可

  • 什么时候在HDFS创建分桶的文件夹及文件? 
    分桶表比较特殊,不能使用load,只能通过insert   select方式加载数据
     创建表的时候已经创建了文件夹,通过insert  select的时候才创建文件

  • 把文件传过去以后不用MSCK REPAIR TABLE吗? 

    • 不用,只有分区表需要修复,如果是个分区表,放到文件夹之后还得刷一下元数据

  • 那为什么分区表需要刷新,普通的不需要刷新 ? 

    • 这个就是分区表的特殊性  分区表元数据信息需要刷新到mysql里面去,

      • 分区表比较特殊:有子文件夹
        内部表  外部表  分桶表都没有子文件夹

  • 是不是可以在分区的基础上进行分桶?  

    • 对的,可以继续分桶的,内部分区分桶表  外部分区分桶表

      • 分区分桶表:先对数据进行分文件夹,分了文件夹之后再进行划分桶

  • 从hdfs上导出时,如果是在不同的分区表中,是不是需要加上hdfs的路径呢 

    • 不需要,只需要指定分区条件即可 select * from   user  where month = '201809'  or  month = '201810'

 

  • 1.2、案例演示

    • 1、创建分桶表

    • 在创建分桶表之前要执行的命令

      • set hive.enforce.bucketing=true;   == 开启对分桶表的支持

      • set mapreduce.job.reduces=4;     == 设置与桶相同的reduce个数(默认只有一个reduce)

      • mr的输出,一个reduceTask会输出一个文件

    • # 进入hive客户端然后执行以下命令

      • use myhive;

      • set mapreduce.job.reduces=4;  

      • set hive.enforce.bucketing=true; 

    • --分桶表
      create table myhive.user_buckets_demo(id int, name string)
      clustered by(id) 
      into 4 buckets 
      row format delimited fields terminated by '\t';
      --表示按照id进行hashCode取值 %  4  确定每一条数据需要去到哪一个文件里面去
      --就是前面的mr当中的分区的操作​
      
      --普通表
      create table user_demo(id int, name string)
      row format delimited fields terminated by '\t';
    • 2、准备数据文件 buckets.txt

    • #在linux当中执行以下命令
      cd /kkb/install/hivedatas/
      vim user_bucket.txt
      ​
      1   laowang1
      2   laowang2
      3   laowang3
      4   laowang4
      5   laowang5
      6   laowang6
      7   laowang7
      8   laowang8
      9   laowang9
      10  laowang10
  • load data local inpath '/kkb/install/hivedatas/user_bucket.txt'  overwrite into table user_demo; 
    
     ---在hive客户端当中加载数据
    load data local inpath '/kkb/install/hivedatas/user_bucket.txt' into table user_demo;

     

  • 4、加载数据到桶表user_buckets_demo

  insert into table user_buckets_demo select * from user_demo;
  • 5、hdfs上查看表的数据目录

  • 6、抽样查询桶表的数据

    • tablesample抽样语句,语法:tablesample(bucket x out of y)

      • x表示从第几个桶开始取数据

      • y表示桶数的倍数,一共需要从 ==桶数/y== 个桶中取数据

select * from user_buckets_demo tablesample(bucket 1 out of 2)
​
-- 需要的总桶数=4/2=2个
-- 先从第1个桶中取出数据
-- 再从第1+2=3个桶中取出数据

二、Hive表的DDL操作

2.1、Hive修改表结构

修改表名称语法

alter table  old_table_name  rename to  new_table_name;

2.1.1、 修改表的名称

alter table stu3 rename to stu4;

2.2 表的结构信息

hive> desc stu4;
​
hive> desc formatted stu4;

2.3 增加/修改/替换列信息

  • 增加列

hive> alter table stu4 add columns(address string);
  • 修改列

hive> alter table stu4 change column address address_id int;

三、Hive数据导入

从hdfs上导出时,如果是在不同的分区表中,是不是需要加上hdfs的路径呢 
           不需要,只需要指定分区条件即可 select * from   user  where month = '201809'  or  month = '2018

导出来的是一个文件夹还是一个文件   文件夹下面有文件

只有分桶表不可以load,其他的都可以

内部分区表 外部分区表  分区表需要load到对应的分区文件夹下面  然后 msck  repair
内部表 外部表  都是可以load

分区表的分区条件在建表的时候是不是不能出现在见表语句的,字段定义中 ?对对对的
create  table  myuser (id int ,name age,month string ) partitioned by (month string)  报错

 

导入和’导出时,可以对字段进行操作吗  可以的

insert overwrite  directory '/kkb/hivedatas/stu'  row format delimited fields terminated by  ','  
  select id from stu;

3.1、直接向表中插入数据(强烈不推荐使用)

hive (myhive)> create table score3 like score;
hive (myhive)> insert into table score3 partition(month ='201807') values ('001','002','100');

3.2、通过load方式加载数据(必须掌握)

语法:

 hive> load data [local] inpath 'dataPath' overwrite | into table student [partition (partcol1=val1,…)]; 

通过load方式加载数据

hive (myhive)> load data local inpath '/kkb/install/hivedatas/score.csv' overwrite into table score3 partition(month='201806');

3.3、通过查询方式加载数据(必须掌握)

通过查询方式加载数据

hive (myhive)> create table score5 like 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值