Hive 7. 表分类与表操作

表分类与表操作

内部表(管理表)

创建表

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!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值