HiVE-表库操作(三)

1.Hive的分区表操作

  Hive开发中,在存储数据时,为了更快地查询数据和更好地管理数据,都会对hive表中数据进行分区存储;所谓的分区,在hive表中体现的是多了一个字段;而在底层文件存储系统中,比如HDFS上,分区则是一个文件夹,或者说是一个文件目录,不同的分区,就是数据存放在根目录下的不同子目录里,可以通过show partitions查看;

  hive分区分为静态分区和动态分区;

  (1)创建分区表:静态分区和动态分区的建表语句一致;

create table test_partition(id String,name String)partitioned by (year int)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

    

  (2)插入语句:由于静态分区和动态分区的插入语句不一样,所以分开了;

  1.1 静态分区

    在语句中指定分区字段为某个固定值    

    1.1.1 insert语句:

insert into table test_partition partition(year=2018) values('001','zhangsan');
insert into table test_partition partition(year=2018) values('001','张三');
insert into table test_partition partition(year=2018) values('002','李四');

    1.1.2 load语句:

load data local inpath '/opt/module/hive/data/test_partition' into table test_partition partition(year=2018);
load data local inpath '/opt/module/hive/data/test_partition' into table test_partition partition(year=2018);
load data local inpath '/opt/module/hive/data/test_partition' into table test_partition partition(year=2017);

    1.1.3 查看表数据:

select * from test_partition;

      

    1.1.4 HDFS的存储形式:

      

  1.2 动态分区

    1.2.1 动态分区默认不开启,需要使用下列语句开启:(需退出hive,重新进入执行)

set hive.exec.dynamici.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.mode.local.auto=true;
SET hive.exec.max.dynamic.partitions=100000;
SET hive.exec.max.dynamic.partitions.pernode=100000;
set hive.exec.max.created.files=100000;

    1.2.2 insert语句插入数据:

insert into table test_partition partition(year) values('001','张三',2016);

    1.2.3 load语句插入: 

load data local inpath '/opt/module/hive/data/test_partition' into table test_partition pattition(year);

      在这里执行会出现错误,如下解决方案:

      创建一张没有分区的表:

create table test(id String,name String,year int)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

        

      将数据载入到没有分区的表中:

        

load data local inpath '/opt/module/hive/data/test' into table test;      

        

       然后从表test,动态分区的插入到test_partition表中:  

insert into table test_partition partition(year) select * from test;   

        

  1.3 总结

    静态分区中的数据需要手动指定,当分区的值很多的情况下,就要不停的使用insert语句进行显示指定;

    动态分区可以通过select语句实现数据的一次性导入,而且可以通过数据源中不同分区列的值动态的生成响应的目录,并把对应的数据写入对应目录中;

    简单的来说:静态分区是给与固定的值,而动态分区可实现分区数据的动态指定;

  1.4 分区的其他操作

    1.4.1 修改分区

      语法:Alter table 表名 partition (分区列=分区值) set location 新分区地址;

      注意:此时原先的分区文件夹仍存在,但是在往分区添加数据时,只会添加到新的分区目录;

    1.4.2 删除分区

      语法:Alter table 表名 drop partition(分区列=分区值);

alter table test_partition drop partition(year='2017');

      

2.分桶表

  2.1 分桶表描述  

    分桶是相对分区进行更细粒度的划分;分桶将整个数据内容按照某列属性值得hash值进行分区,如要按照name属性分为三个桶,就是对name属性值的hash值对三取模,按照取模结果对数据分桶;如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件;

  2.2 创建分桶表

create table student_bck(id int,name String)clustered by(id) into 3 buckets row format delimited fields terminated by ",";

    

  2.3 向桶中插入数据

insert overwrite table student_bck select id,name from test;

  2.4 查看存储信息

    

  2.5 查看分桶数据

select * from student_bck;

    

3.Hive的连接方式

  3.1 CLI连接

     

    上面的hive命令相当于在启动的时候执行:hive --service cli

    使用hive --help,可以查看hive命令可以启动那些服务

    通过hive --service serviceName --help可以查看某个具体命令的使用方式;

  3.2 HiveServer2/beeline

    hive-2.3.3版本中:都需要对hadoop集群做如下改变,否则无法使用;

    (1)编辑hadoop集群的hdfs-site.xml文件:

<property>
   <name>dfs.webhdfs.enabled</name>
   <value>true</value>
</property>

    (2)编辑hadoop集群的core-site.xml文件,设置hdfs的代理用户:

   <property>  #此处的root必须与master主机用户名相同
     <name>hadoop.proxyuser.root.hosts</name>
     <value>*</value>
   </property>
   <property>
     <name>hadoop.proxyuser.root.groups</name>
     <value>*</value>
   </property>

    (3)通过scp命令远程传递到hadoop103和hadoop104节点上:

scp hdfs-site.xml core-site.xml root@hadoop103:/opt/module/hadoop/etc/hadoop/
scp hdfs-site.xml core-site.xml root@hadoop104:/opt/module/hadoop/etc/hadoop/

    (4)重启hadoop集群,并格式化NameNode节点:

    (5)启动hiveserver2服务:

hiveserver2

    以上方式基于前台线程启动hive服务,我们可以使用nohup命令基于后台启动;

nohup hiveserver2 1>/opt/module/hadoop/hiveserver.log 2>/opt/module/hadoop/hiveserver.err &

    (6)启动beeline客户端去连接

方式1:
beeline #进入hive的客户端
!connect jdbc:hive2://master:10000 #设置连接URL
root  #输入用户名 密码省略
方式2:直接连接
beeline -u 'jdbc:hive2://master:10000/hive_01' -n root
原文地址:https://www.cnblogs.com/wnwn/p/12750458.html