表分类与表操作
内部表(管理表)
创建表
Create table If Not Exists mydb.users (
name String Comment 'user name',
salary Float Comment 'user salary',
hobby Array<String> Comment 'user hobby'
)
Comment 'description of user table'
TblProperties ('creator'='me', 'created_at'='2016-10.30')
Location 'user/henvealf/hive/warehouse/mydb.db/users'
Row Format Delimited
Fields Terminated by ','
Collection items Terminated By '\002'
Map Keys Terminated By '\003'
Line Terminated By '\n'
Stored As TextFile;
- 指定表放在哪个数据库中:这里是 mydb,
- 为每个字段进行了备注,
- 为表添加了键值对属性,
- 修改了数据存放路径,
- 设置了字段之间的分隔符’,’
- 集合元素之间的分隔符’\002’
- Map 之间键值对的分隔符’\003’
- 行的分隔符为 ‘\n’
- 表数据存储为文本格式。
Hive 表中会自动添加两个表属性:
1. last_modified_by 最后修改这个表的用户的用户名。
2. last_modified_time 最后一次修改的新纪元时间表。
拷贝表模式,么有数据哦!
Create Table If Not Exists mydb.user2
Like mydb.user;
拷贝模式与数据
Create Table If Not Exists mydb.user2
As Select * from mydb.user;
列出所有的表
Show Tables;
Show Tables In mydb;
Show Tables 'us.*';
前一个列出当前位置的数据库中的表,
中一个列出指定数据库中的表,
后一个使用正则表达式(注意并不支持所有的正则表达式功能)。
现在已经支持 In dbname 与 正则表达式混用。
查看表的详细表结构信息
Describe Extended mydb.user;
使用 Extended 读出的信息可读性差。最好使用 Formatted 关键字:
hive> describe formatted mydb.user;
- 查看某一列的信息
Describe mydb.user.name;
上面所说的都是内部表,也叫管理表,即表的元数据与数据文件都由 Hive 来进行控制。
内部表的数据都会保存在Hive中所配置的路径中,即 hive.metastore.warehouse.dir 配置的值。
当删除一个内部表时, Hive 会同时删除内部表的元数据与数据文件。
修改列信息
Alter Table table_name
Change Column cname new_cname String
Comment 'hahaha'
After name;
最后 After name 是指将该列移动到name列后面。
增加列
Alter Table table_name Add Columns (
app_name String Comment 'apppppppp',
session_id Long Comment 'laalalalaal'
);
删除或者替换列
下面会删除所有的列,然后重新定义列。
Alter Table students Replace Columns (
app_name String Comment 'apppppppp',
session_id Long Comment 'laalalalaal'
);
修改表属性
只能增加或者修改已经存在的属性,无法删除。
Alter Table table_name Set TblProperties
('notes' = 'dadada');
修改存储属性
太多了,累的要命,SerDe什么的,不写了。
外部表
管理表的缺点就是不方便与其他客户端共享数据。并且管理容易杂乱。
所以现在就出现了一类名为 外部表 的表,故名思议,就是保存在数据目录之外的表。
创建外部表 (External)
就是使用 External 关键字。来告诉 Hive 这个表是外部的,最后使用 Location 关键字来指明数据文件的存放路径。
Create External table If Not Exists id_card (
name String,
number String,
create_date String
)
Row Format Delimited Fields Terminated By ','
Location '/data/id_card'
;
复制成外部表
只复制表模式
Create External Table If Not Exists mydb.user3 Like mydb.user Location '/data/exter_user'
貌似这里没有 as 用法,我试的是不行。
外部表与内部表的区别
- 当删除外部表的时候,只会删除 metastore 中的元数据,而数据文件不会删除。
分区表
分区表是根据用户自定义的分区规则来对表数据进行的分区,而其实际是讲数据按按照一种符合逻辑的方式进行组织,一般为按目录分层存储。
分区表一般会使用表中具有枚举特征的属性(并不必须存在于表的列属性中)来对表数据进行分割,这里简单的例子学生的生源地。
创建分区表
Create Table students (
id Int,
name String,
sex String,
hobby Array<String>
)
Partitioned by (provice string, city string)
Row Format
Delimited Fields Terminated By '\t';
向表中加载数据
Load Data Local InPath '/usr/henvealfSoftware/hive-test-data/file1'
Into Table students
Partition (provice='shanDong', city='jiNan');
Load Data Local InPath '/usr/henvealfSoftware/hive-test-data/file2'
Into Table students
Partition (provice='shanDong', city='QingDao');
Load Data Local InPath '/usr/henvealfSoftware/hive-test-data/file3'
Into Table students
Partition (provice='zheJiang', city='weiZhou');
Load Data Local InPath '/usr/henvealfSoftware/hive-test-data/file4'
Into Table students
Partition (provice='zheJiang', city='weiZhou');
加载完数据之后,查看数据目录,可以发现:
/user/henvealf/hive/warestore/users
provice=shanDong
city=jiNan
file1
city=QingDao
file2
provice=zheJiang
city=weiZhou
file3
file4
除了那几个file?是数据文件,其他全为目录。
一看便知。是按照目录来根据分区分层来区分各个分区文件,这种组织方式很明显会提高检索数据的速度。
使用分区查询数据
Select * From students
Where province = 'shanDong' and city = 'jiNan'
Where 里面那些叫做分区过滤器。
这里要注意的是,如果用户查询时没有写分区过滤器,那么 Hive 会遍历整个层级目录,如果数据量很庞大,那么就完蛋了。所以这有一个建议就是将 Hive 模式设置为 strict(严格),这样如果对分区表没有加分区过滤的话,Hive 会拒绝查询。
严格配置项为:
hive.mapred.mode=strict
非严格配置项为:
hive.mapred.mode=nonstrict
查询出结果后,会发现在表中还会列出两列关于分区的列。
查询是否有指定分区
Show Partitions students Partition(province='JiangShu');
添加分区
Alter Table students Add Partition(province = 'shandong', city = 'jinan')
Location 'hdfs://master_server/user/henvealf/exter_par/shandong/jinan';
修改分区路径
Alter Table students Partition(province = 'shandong', city = 'jinan')
Set Location 'hdfs://master_server/user/henvealf/exter_par/s/j';
该操作不会删除或者移走原分区的数据。
外部分区表
Create External Table students (
id Int,
name String,
sex String,
hobby Array<String>
)
Partitioned by (provice string, city string)
Row Format
Delimited Fields Terminated By '\t';
我们注意到这里并没有指定 Location, 这样是可以的。
我们可以在建表之后来设置其分区目录,这样能使用我们自己希望的目录命名方式;
添加方法如上描述。
删除表
Drop table If Exists students;
Hadoop 的回收站位置 /user/$USER/.Trash,会暂时存放被删除的文件。
开启配置:
fs.trash.interval=一个值(分钟数)。
值是指“回收站检查点”,即多长时间清理一次回收站。
重命名 rename
修复元数据
msck repair table table_name;
End!!