zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    ASP.NET ValidationGroup 属性和CssClass 属性
    sql 在将 nvarchar 值 转换成数据类型 int 时失败。
    select 1 from table
    OLEDB和ODBC的区别
    ASP.NET 读数据库绑定到 TreeView 递归方式
    用python做网页抓取与解析入门笔记[zz]
    win8.1安装驱动出现“文件的哈希值不在指定的目录”的解决办法[zz]
    Linux磁盘IO监控[zz]
    硬盘内部硬件结构和工作原理详解[zz]
    fcitx五笔的安装[zz]
  • 原文地址:https://www.cnblogs.com/wnwn/p/12750458.html
Copyright © 2011-2022 走看看