Hive的基本操作

摘要:
创建[外部]表<//默认情况下,内部表配置单元>已创建//查看此数据库下的所有表:隐藏>//查看表结构配置单元>1.在MySQL上查看hive数据库的元信息>//查看在hive MySQL中创建的所有表>选择*fromcolumns_v2;
一、创建数据库

  hive>create database mydb ; //hql和mysql语法极其相似

  hive>show databases;//查看所有数据库

二、创建表

  格式:

    create [external] table <表名>(列的定义,....)  [row format delimited fields terminated by ' ' lines terminated by ' ']

  举例:

    hive>use mydb;//使用数据库

    hive>create table player(id int,name string,club string);//默认创建的是内部表

    hive>show tables;//查看该数据库下的所有表

    hive>desc player;//查看表结构

    hive>desc formatted player;//看到格式化的详细信息,比如:表的类型,是内部表(管理表)还是外部表

  说明:

    整个数据库的数据分两块,数据库的元信息(表结构等)存储在RDBMS上的一个数据库中,如mysql,数据直接存储在hdfs上。

  1、在mysql上查看hive数据库的元信息

      mysql>use hive;//hive是在mysql中事先创建好的数据库,而数据库名hive则是在配置hive外模式数据库mysql时指定的,在hive-site.xml配置文件中。

      mysql>select * from dbs;//查看hive中创建的所有的数据库

      mysql>select * from tbls;//查看hive中创建的所有表

      mysql>select * from columns_v2;//查看hive中创建的所有字段

  

  2、在hdfs上查看数据

    $>hdfs dfs -ls -R /user/hive/warehouse/mydb.db/player/  

      -rwxr-xr-x   2 root supergroup         18 2018-09-10 16:37 /user/hive/warehouse/mydb.db/player/000000_0  

      //mydb.db和player是数据库和表在hdfs上对应的文件夹,000000_0是数据文件,可以使用cat查看内容

三、查询数据

  格式:select <字段> from <表名>

  说明:和SQL类似

  举例:hive>select * from player

四、向表中添加数据

  格式:

    load data [local] inpath '文件路径' [overwrite] into table <表名>

  说明:

    [local]表示local是个可选项,如果要导入的数据文件在本地,需加local;如果数据文件在hdfs上,则无需加local

    [overwrite]表示覆盖,即将原表中的数据全部删除。

  举例:

    hive>load data local inpath '/root/mytemp/player_data' into table player;  //player_data的数据是结构化的数据,和player表中字段一一对应。

五、修改/删除

  hive不支持

  但可以对其对应的hdfs的数据进行修改或删除操作

六、创建外部表

  举例:

    hive>create external table student(id int,name string) row format delimited fields terminated by ' ' location '/mydata/external'

  说明:

    (1)和创建内部表相比多了红字部分。

    (2)location指定的位置是hdfs上的路径

    (3)创建外部表的不会移动数据,仅在元数据中记录数据的位置。外部表和内部表最大的区别,外部表删除表(drop table)时,只是删除表的元数据,并不删除hdfs上的数据,而内部表删除时,元数据和数据都会删除。

七、分区表

  举例:

    hive>create table person(id int,name string)  partitioned by (city string)  row format delimited fields terminated by ' '

  结果:

    id int
    name string
    city string

    # Partition Information
    # col_name data_type comment

      city string

  说明:

    (1)注意partitioned的位置,要在row format之前。

    (2)注意原表中的字段只有id和name

  1、查看分区: 

     hive>show partitions person;

  2、为分区表加载数据

  (1)使用load data加载数据

    hive>load data local inpath '/root/mytemp/wuhu.txt' into table person partition(city='wuhu');

    hive>select * from person;

      201801 zhangsan wuhu  //wuhu是分区的名字,表示该记录在wuhu这个分区里,并不是表中的字段
      201802 lisi wuhu

      在hdfs上查看

        $>hdfs dfs -ls -R /user/hive/warehouse/mydb.db/person

          drwxr-xr-x - root supergroup 0 2020-02-29 16:07 /user/hive/warehouse/mydb.db/person/city=wuhu
          -rwxr-xr-x 2 root supergroup 28 2020-02-29 16:07 /user/hive/warehouse/mydb.db/person/city=wuhu/wuhu.txt

        $>hdfs dfs -cat /user/hive/warehouse/mydb.db/person/city=wuhu/wuhu.txt

          201801 zhangsan
          201802 lisi  

    hive>select * from person where city='wuhu'

    说明:

      分区以后,表中的数据结构不变,只是表中的数据分在不同的hdfs目录文件中。'分区字段=<值>'就是相应的目录。或者说通过文件夹将数据分开。

      表中数据分散在不同的文件的好处,就可以避免全表扫描。比如,我要找'wuhu'市的数据,只要在wuhu.txt文件中查找就行了,我要找'hefei'市的数据,只要到hefei.txt查找就行了,这样缩小了搜索的范围。只是在前期存储的时候要分区存储,看起来比较麻烦,但带来的好处是查询的速度提升了。

   (2)从一个查询结果中加载数据到分区

    格式:insert [overwrite] table <表名> partition(分区名='分区值') select <查询>

    举例:insert overwrite table person partition(city='bengbu') select id,name from student;//会转成MR程序执行

    结果:

      $>hdfs dfs -ls -R /user/hive/warehouse/mydb.db/person

      drwxr-xr-x   - root supergroup          0 2020-02-29 16:42 /user/hive/warehouse/mydb.db/person/city=bengbu

      -rwxr-xr-x   2 root supergroup         20 2020-02-29 16:42 /user/hive/warehouse/mydb.db/person/city=bengbu/000000_0  //000000_0是数据文件

      drwxr-xr-x   - root supergroup          0 2020-02-29 16:07 /user/hive/warehouse/mydb.db/person/city=wuhu

      -rwxr-xr-x   2 root supergroup         28 2020-02-29 16:07 /user/hive/warehouse/mydb.db/person/city=wuhu/wuhu.txt

     作业:

    1、在linux本地节点上创建文本文件anhui.txt,保存安徽人的数据,并输入数据如下:

    1801  刘备

    1802  关羽

    

    2、在linux本地节点上创建文本文件jiangsu.txt,保存江苏人的数据,并输入数据如下:

    1901  孙权

    1902  周瑜

    3、在hive中创建分区表person(id,name),分区的列为province,string类型。

    4、将anhui.txt的数据导入到person表的province=anhui分区

    5、将jiangsu.txt的数据导入到person表的province=jiangsu分区

    6、分别查看person表的所有数据、安徽省的数据、江苏省的数据,并作一张截图。

    7、使用hadoop的webUI查看hdfs中person目录,并作一张截图。

  

八、分桶表

  1、创建分桶表

    格式:create table <表名>(列的定义,...) clustered by (分桶字段) into <n> buckets 

    举例:create table bucketed_student(id int,name string) clustered by (id)  into 4 buckets stored as orc;

    //ORC格式属于hive的RCFILE的升级版,一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。

  2、导入数据

    insert into table bucketed_student select id,name from student;

    //说明只有TextFile格式的表才能使用load data导入数据文件。

    //查看hdfs

    $>hdfs dfs -ls -R /user/hive/warehouse/mydb.db/bucketed_student; 

      -rwxr-xr-x 2 root supergroup 19 2020-02-29 19:16 /user/hive/warehouse/mydb.db/bucketed_student/000000_0  //取余4为0
      -rwxr-xr-x 2 root supergroup 31 2020-02-29 19:16 /user/hive/warehouse/mydb.db/bucketed_student/000001_0  //取余4为1
      -rwxr-xr-x 2 root supergroup 29 2020-02-29 19:16 /user/hive/warehouse/mydb.db/bucketed_student/000002_0  //取余4为2
      -rwxr-xr-x 2 root supergroup 20 2020-02-29 19:16 /user/hive/warehouse/mydb.db/bucketed_student/000003_0  //取余4为3

  3、查询数据

    hive>select * from bucketed_user tablesample(bucket 1 out of 16 on id) ;  //1表示从1开始分配,抽取第1桶数据的比例为4/16,即抽取第1桶1/4的数据。

      1008 bob  

    

    hive> select * from bucketed_student tablesample(bucket 1 out of 4 on id) ;
      1008 bob
      1004 rose

    hive>select * from bucketed_student;

      //总数据

      1001 mike  #第2桶,即余数为1,对应的文件为000001_0
      1002 john  #第3桶,即余数为2,对应的文件为000002_0
      1003 mike  #第4桶,即余数为3,对应的文件为000003_0
      1004 rose  #第1桶,即余数为0,对应的文件为000000_0
      1005 joan  #第2桶,即余数为1,对应的文件为000001_0
      1006 davi  #第3桶,即余数为2,对应的文件为000002_0
      1007 alex  #第4桶,即余数为3,对应的文件为000003_0
      1008 bob  #第1桶,即余数为0,对应的文件为000000_0
      1009 kitty  #第2桶,即余数为1,对应的文件为000001_0
      1010 tom  #第3桶,即余数为2,对应的文件为000002_0

   小结:  

    桶是比表或分区更为细粒度的数据范围划分。针对某一列进行桶的组织,对列值哈希,然后除以桶的个数求余,决定将该条记录存放到哪个桶中。

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

    (1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在相同列(包含连接列的)上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作:对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作,那么将保存相同列值的桶进行JOIN操作就可以,可以大大减少JOIN的数据量

    (2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
分桶:如果我们根据某列进行分桶,意思就是对这列的值进行hash,然后除以桶的个数再决定把这个值放到哪个桶中,当我们查询数据的时候,where 分桶列=“” 首先也会对这个条件的值进行hash,找到他所在的桶,这样的话 其他桶就不会再找避免暴力扫描,速度上也会提升

    和分区区别:分区是增加实际目录,每增加一个分区就会多个目录,分桶时把一个大的文件分成多个小文件。
    分桶表的作用:最大的作用是用来提高join操作的效率;但是两者的分桶数要相同或者成倍数。
 

免责声明:文章转载自《Hive的基本操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java中类加载过程和对象创建过程HTML5触摸事件演化tap事件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle下批量将一个用户的所有表的select权限赋值给另外一个用户

起因   为什么会有这篇文章呢? 因为最近在做项目的时候遇到一个问题...实际生产环境中程序datasource登陆的Oracle数据库用户user1不是我们创建的.这个用户没有访问我们业务表的权限(因为和其他公司合作,用user1去访问它们的数据)....我们开发中用到的用户user2是我们自己创建的有相关业务表的权限,而这个用户user2在实际生产环境...

mongoDB在windows下安装与配置方案

首先在官网下载mongoDB的安装包: https://www.mongodb.org/downloads 百度云盘下载:http://pan.baidu.com/s/1slUSGYp (安装版 windows64位) 注意:根据自己电脑系统下载相应版本 下载完选择(自定义或默认安装),安装文件后: 在D盘中选择建立文件夹命名为 mongonD 在...

Word 中设置图、表、公式、代码要与正文之间行间距

一、概述 在撰写论文等文档时,常常对图、表、公式、代码要与正文之间行间距有要求。例如: (5)图、表、公式、代码要与正文之间有6磅的行间距。 二、设置方式 选中 图/表/公式/代码 与 图题/表头/-/- ,点击鼠标右键->段落->间距->段前/段后。 如下图: 效果如下图: 此文在我的 Github Pages 上同步发布,地址为:{...

PostgreSQL中的Object Identifier(oid)数据类型

PostgreSQL在内部使用对象标识符(OID)作为各种系统表的主键。OID不会添加到用户创建的表中,除非在创建表时指定了WITH OIDS,或者启用了default_with_oids配置变量。类型oid表示对象标识符。oid还有几种别名类型:regproc,regprocedure,regoper,regoperator,regclass,regty...

JavaMail入门:创建纯文本、HTML格式的邮件

转自:http://haolloyin.blog.51cto.com/1177454/353849/ 在 http://java.sun.com/products/javamail/ 下载了 JavaMail 1.4.3 版本,如果所用 JDK 是 6.0 则不用再下载 activation 。下载得到的是 javamail-1.4.3.zip 的压缩包,...

SV中的数据类型

Verilog-1995中规定的数据类型有:变量(reg), 线网(wire), 32位有符号数(integer), 64位无符号数(time), 浮点数(real)。 SV扩展了reg类型为logic,除了reg类型的功能外,可以用在连续赋值,门单元和模块所驱动。但是不能用在双向总线建模,不能有多点驱动。 其他数据类型:无符号双状态  bit,     ...