Hive学习笔记(Hive数据的定义与 *** 作)

Hive学习笔记(Hive数据的定义与 *** 作),第1张

Hive学习笔记(Hive数据的定义与 *** 作)

Hive学习笔记(Hive数据的定义与 *** 作)
  • Hive数据定义与 *** 作
    • HiveQL数据定义语言
      • 创建数据库
      • 删除数据库
      • 创建表
        • 1.管理表
        • 外部表
      • 修改表
      • 删除表
      • 分区表
        • 静态分区
        • 动态分区
    • HiveQL数据 *** 作
      • 向管理表中装载数据
      • 经查询语句向表中插入数据
      • 单个查询语句中创建表并加载数据
      • 导入数据
      • 导出数据

Hive数据定义与 *** 作 HiveQL数据定义语言

Hive数据仓库中的HiveQL数据定义语言,类似于数据仓库DDL,用来数据仓库中创建数据仓库中创建数据库、数据表等Schema数据模式设计。

创建数据库

Hive的数据库本质上仅仅是表一个目录或者命名空间。创建一个数据库实际上就是在HDFS分布式文件系统中创建一个目录,这个目录将成为创建表的目录或表的NameSpace命名空间,
创建数据库的语法如下:

hive> create database sogou;

如果sogo数据库存在湖抛出一个异常,命令可以修改成

hive> create database if not exists sogou;

show database命令可以查看Hive中所包含的数据库,数据库非常多时时可以使用正则表达式来筛选处所需要的数据库名, *** 作命令如下:

hive> show database  like  's.*';

在实际开发中可以为没个数据库增加描述,以此来说明该数据库的业务含义,coment后面的是数据库的描述,具体命令如下:

hive> create database bank coment 'Internet Banking';

查看数据库详细信息语句:

hive> describe database test;


hdfs://namenode:9000/user/hive/warehouse/test.db是Hive数据库test在分布式数据库的HDFS上创建的一个目录,即/user/hive/warehouse/test.db,数据库test中所有表都会以这个目录的子目录形式储存。
默认情况下,在Hive中创建数据库其目录默认都在/user/hive/warehouse/目录下。

删除数据库

删除数据库的 *** 作命令如下:

hive> drop database sogo;  //删除sogo数据库
hive> drop database if exists sogo; //加上if exists防止数据库不存在抛出异常,

Hive数据仓库默认不允许删除一个包含表的数据库,如果我们对其直接进行删除,会抛出异常。我们需要将数据库中的表删除,才能删除数据库,我们可以在后面加上关键字casecade;命令如下:

hive> drop database if exists sogo casde;
创建表

Hive数据仓库提供了类似关系型数据库的表结构存储,所以可以创建数据仓库,然后基于数据库来创建表应用,最后通过表;爱管理业务数据。例:


其中,create table if not exists enterprise.accout(acc_name string,acc_balance double)用来定义表accout以及表中字段acc_name和acc_balance。fields terminated by ‘t’用来定义每行中列之间的分隔符为’t’,location ‘/usr/hive/warehouse/enterprise.db/accout,’;用来定义数据存放地址,默认情况下,Hive总是创建表目录放置在这个表所属的数据库目录下。
我们可以指定数据库下的表,命令如下:

hive> show tables in 数据库名;

在Hive中分为内部表和外部表。

1.管理表

管理表又称内部表或临时表,Hive控制这管理表整个生命周期,当我们删除一个表时,表的数据也会相应地被删除。管理表能够有效的管理表中的数据,但是不利于数据的分享。例:同一份数据,我们希望表A 和表B同时共享这同一份数据,但如果删除表A,此时表B已经变成一个空表了。
例:
load data local inpath是将数据导入到数据库中,’/accout.txt’是数据的存储位置,into table accout是导入的表。

外部表

在创建表时如果加上关键字external,则创建的为外部表,外部表的生命周期不受Hive控制,且可以和其他外部表进行数据的共享。例:

location '/data/stocks’这是定义外部表product存放数据的HDFS路径地址。
即使表product被删除,但表上的数据没有被删除。在实际开发中主要使用外部表。

修改表

在实际开发中许多表都需要更改,大多数表都可以通过alter table语句来修改,修改表名:

hive> alter table 原表名 rename to 新表名;

为表增加一些字段, *** 作命令如下:

hive> alter table 表名 add columns(新字段);
删除表

删除表的语法结构为:drop table 表名;
对于内部表会删除表的元数据信息和表内的数据,对于外部表只会删除元数据。

分区表

解决数据库性能的方式有以下几种,
第一,创建分表,即把一张大表的数据根据业务需求分配到多张小表中,一次提高表的并发量,但缺点是SQL代码维护成本增高。
第二,创建分区表,级所有数据还是在一张表中,但底层物理存储结构根据一定的规则划分到不同的文件中,这些文件还可以储存在不同的磁盘上,这种代码维护量小,基本不用改动,但缺点是表的并发量没有增加。
Hive的分区方式是在HDFS文件系统上的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。Hive的分区是创建层级目录的一种方式。
Hive分区是在创建表的时候用partitioned by关键字定义的。parititoned by子句中定义的是表中正规的列,但是Hive下数据文件并不包含这些列,因为它们只是目录名。

静态分区

创建一张静态分区表customer_partition,并且只有一个分区 *** 作命令如下:

向其中导入数据:

在创建一个分区表

新建表的时候定义的分区字段的顺序,决定了开辟在HDFS系统上文件目录的顺序(谁是父目录,谁是子目录),查询父目录时子目录下的也会出现,值查询子目录,那么父目录的分区不会显示。

动态分区

如果使用静态分区,那么就必须首先知道有哪些分区类型,支队一个分区要单独使用load data命令载入数据。动态分区不用指定分区目录。
开启动态分区目录的功能 *** 作命令为:

hive>set hive.exec.dynamic.partition=true;
hive>set hive.exec.dynamic.partition.mode=nonstrict;//此属性的默认值是strict,意思是不允许分布式动态的,将其社为nonstrict,意思是所有的分区--列都是动态的。
hive> set.hive.exec.max.dynamic.partitions.pernade=1000;//最大分区个数

例:创建动态分区表customer_partition_1:

hive> create table customer_partition_1(name string,age int)partitioned by(sex string,native string) row format delimited fields terminated by 't';

接下来使用insert overwrite命令将表customer_1中的数据写入到动态分区表:

hive> insert overwrite table customer_partition_1 partition(sex,native)  select name,age,sex,native from customer_1;

最后查看分区表customer_partition_1的目录结构。

HiveQL数据 *** 作 向管理表中装载数据

创建管理表sogo并向其中写入数据 *** 作如下所示:


其中load data local inpath ‘/product.txt’ overwrite into table sogou.sogou;是想其中导入数据。

经查询语句向表中插入数据

例:向表中sogou_xj中插入符合条件的数据, *** 作命令如下:

hive> insert overwrite table sogou_xj select * from sogou.sou_500w where keyword like '仙剑奇侠传' ;
单个查询语句中创建表并加载数据

对表sogou_xj中的数据进行备份,我们可以在单个查询语句中创建表sogou_xj_back_up并向其中加载数据, *** 作命令如下:

hive> create table sogo.sogou_xj_backup as select *from sogou.sogou.xj;
hive> select * from sogou.sogou_xj_backup limit 10;//查询表sogou_xj_backup中的数据 
导入数据

Hive表中的数据,最终落在HDFS文件系统上,我们可以通过HDFS命令直接将数据写入到Hive表LOCATION属性缩指向的地址。
通过HDFS命令行接口直接将数据导入到Hive表中,就是将数据文件放到LOCATION属性所致向的路径下。然后就可以通过HiveQL语句进行查询了。

导出数据

从Hive数据仓库中导出数据到本地,启示就是HDFS中导出数据,使用HDFS的命令行接口可以完成。语句是:

hadoop fs -get 数据地址,

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5618545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存