1 Hive中的数据定义
1.1 存储与创建
Hive会为每个数据库创建一个目录。数据库中的表以子目录的形式存储。
有一个例外是default中的表,因为这个库本身没有目录。
数据库的顶级目录是hive.metastore.warehuse.dir所指定的目录。
假设用户使用的是默认配置/user/hive/warehuse,那么我们创建数据库test时,会对应创建一个目录/user/hive/warehuse/test.db(数据库目录是以.db结尾的)。
可以通过如下命令进行修改:
hive> CREATE DATABASE test LOCATION '/mylocation';
可以命令可以查看该数据库的描述:
hive> DESCRIBE DATABASE test;
1.2 创建表
hive创建表的语句遵从SQL语句习惯,但是hive有一些扩展:
hive> CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
> [(col_name data_type [COMMENT col_comment], ...)] [
> COMMENT table_comment]
> [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
> [LOCATION hdfs_path]
1)PARTITIONED 表示的是分区,不同的分区会以文件夹的形式存在,在查询的时候指定分区查询将会大大加快查询的时间
2)LOCATION指的是在HDFS上存储的位置
当然这里列举的是常用的选项。
1.3 外部表与内部表
1)创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
2)删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
2 Hive中的数据操作
2.1 Hive四种数据导入方式
1)从本地文件系统中导入数据到Hive表
先在Hive里面创建好表:
hive> create table lac
> (id int, name string,
> age int, tel string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ' '
> STORED AS TEXTFILE;
本地文件系统里面有个/home/xinniu/lac.txt文件,内容如下:
1 wyp 25 13188888888888
2 test 30 13888888888888
3 zs 34 899314121
lac.txt文件中的数据列之间是使用 分割的,可以通过下面的语句将这个文件里面的数据导入到lac表里面,操作如下:
hive> load data local inpath 'lac.txt' into table lac;
这样就将lac.txt里面的内容导入到wyp表里面去了,可以到lac表的数据目录下查看,如下命令
hive> dfs -ls /user/hive/warehouse/lac;
注意:
和我们熟悉的关系型数据库不一样,Hive现在还不支持在insert语句里面直接给出一组记录的文字形式,也就是说,Hive并不支持INSERT INTO …. VALUES形式的语句。
2)HDFS上导入数据到Hive表
假设有下面这个文件/home/xinniu/lac.txt,文件内容和上面一样,具体的操作如下:
bin/hadoop fs -cat /home/xinniu/lac.txt
3)从别的表中查询出相应的数据并导入到Hive表中
假设Hive中有test表,其建表语句如下所示
hive> create table test(
> id int, name string
> ,tel string)
> partitioned by
> (age int)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ' '
> STORED AS TEXTFILE;
下面语句就是将lac表中的查询结果并插入到test表中:
hive> insert into table test
> partition (age='25')
> select id, name, tel
> from lac;
4)在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中
hive> create table test2
> as
> select id, name, tel
> from lac;
2.2 导出数据
1)导出到本地文件系统
hive> insert overwrite local directory '/home/xinniu/lac' > select * from lac;
2)导出到HDFS中
hive> insert overwrite directory '/home/xinniu/hdfs' > select * from lac;
注意,和导出文件到本地文件系统的HQL少一个local,数据的存放路径就不一样了。
3)导出到Hive的另一个表中
hive> insert into table test > partition (age='25') > select id, name, tel > from lac;