- Hive数据定义与 *** 作
- HiveQL数据定义语言
- 创建数据库
- 删除数据库
- 创建表
- 1.管理表
- 外部表
- 修改表
- 删除表
- 分区表
- 静态分区
- 动态分区
- 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 数据地址,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)