你会Hive表的基本操作吗?
麦肯锡全球研究所给出的定义是:一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模、快速的数据流转、多样的数据类型和价值密度低四大特征。
create table语句遵从sql语法习惯,只不过Hive的语法更灵活。例如,可以定义表的数据文件存储位置,使用的存储格式等。
本文转载自微信公众号「java大数据与数据仓库」,作者柯同学。转载本文请联系Java大数据与数据仓库公众号。
1. 创建表
create table语句遵从sql语法习惯,只不过Hive的语法更灵活。例如,可以定义表的数据文件存储位置,使用的存储格式等。
- create table if not exists test.user1(
- name string comment 'name',
- salary float comment 'salary',
- address struct<country:string, city:string> comment 'home address'
- )
- comment 'description of the table'
- partitioned by (age int)
- row format delimited fields terminated by '\\t'
- stored as orc;
没有指定external关键字,则为管理表,跟MySQL一样,if not exists如果表存在则不做操作,否则则新建表。comment可以为其做注释,分区为age年龄,列之间分隔符是\\t,存储格式为列式存储orc,存储位置为默认位置,即参数hive.metastore.warehouse.dir(默认:/user/hive/warehouse)指定的hdfs目录。
2. 拷贝表
使用like可以拷贝一张跟原表结构一样的空表,里面是没有数据的。
- create table if not exists test.user2 like test.user1;
3. 查看表结构
通过desc [可选参数] tableName命令查看表结构,可以看出拷贝的表test.user1与原表test.user1的表结构是一样的。
- hive> desc test.user2;
- OK
- name string name
- salary float salary
- address struct<country:string,city:string> home address
- age int
-
- # Partition Information
- # col_name data_type comment
-
- age int
也可以加formatted,可以看到更加详细和冗长的输出信息。
- hive> desc formatted test.user2;
- OK
- # col_name data_type comment
-
- name string name
- salary float salary
- address struct<country:string,city:string> home address
-
- # Partition Information
- # col_name data_type comment
-
- age int
-
- # Detailed Table Information
- Database: test
- Owner: hdfs
- CreateTime: Mon Dec 21 16:37:57 CST 2020
- LastAccessTime: UNKNOWN
- Retention: 0
- Location: hdfs://nameservice2/user/hive/warehouse/test.db/user2
- Table Type: MANAGED_TABLE
- Table Parameters:
- COLUMN_STATS_ACCURATE {\\"BASIC_STATS\\":\\"true\\"}
- numFiles 0
- numPartitions 0
- numRows 0
- rawDataSize 0
- totalSize 0
- transient_lastDdlTime 1608539877
-
- # Storage Information
- SerDe Library: org.apache.Hadoop.hive.ql.io.orc.OrcSerde
- InputFormat: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
- OutputFormat: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
- Compressed: No
- Num Buckets: -1
- Bucket Columns: []
- Sort Columns: []
- Storage Desc Params:
- field.delim \\t
- serialization.format \\t
4. 删除表
这跟sql中删除命令drop table是一样的:
- drop table if exists table_name;
对于管理表(内部表),直接把表彻底删除了;对于外部表,还需要删除对应的hdfs文件才会彻底将这张表删除掉,为了安全,通常hadoop集群是开启回收站功能的,删除外表表的数据就在回收站,后面如果想恢复也是可以恢复的,直接从回收站mv到hive对应目录即可。
5. 修改表
大多数表属性可以通过alter table来修改。
5.1 表重命名
- alter table test.user1 rename to test.user3;
5.2 增、修、删分区
增加分区使用命令alter table table_name add partition(...) location hdfs_path
- alter table test.user2 add if not exists
- partition (age = 101) location '/user/hive/warehouse/test.db/user2/part-0000101'
- partition (age = 102) location '/user/hive/warehouse/test.db/user2/part-0000102'
修改分区也是使用alter table ... set ...命令
- alter table test.user2 partition (age = 101) set location '/user/hive/warehouse/test.db/user2/part-0000110'
删除分区命令格式是alter table tableName drop if exists partition(...)
- alter table test.user2 drop if exists partition(age = 101)
5.3 修改列信息
可以对某个字段进行重命名,并修改位置、类型或者注释:
修改前:
- hive> desc user_log;
- OK
- userid string
- time string
- url string
修改列名time为times,并且使用after把位置放到url之后,本来是在之前的。
- alter table test.user_log
- change column time times string
- comment 'salaries'
- after url;
再来看表结构:
- hive> desc user_log;
- OK
- userid string
- url string
- times string salaries
time -> times,位置在url之后。
5.4 增加列
hive也是可以添加列的:
- alter table test.user2 add columns (
- birth date comment '生日',
- hobby string comment '爱好'
- );
5.5 删除列
删除列不是指定列删除,需要把原有所有列写一遍,要删除的列排除掉即可:
- hive> desc test.user3;
- OK
- name string name
- salary float salary
- address struct<country:string,city:string> home address
- age int
-
- # Partition Information
- # col_name data_type comment
-
- age int
如果要删除列salary,只需要这样写:
- alter table test.user3 replace columns(
- name string,
- address struct<country:string,city:string>
- );
这里会报错:
- FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Replacing columns cannot drop columns for table test.user3. SerDe may be incompatible
这张test.user3表是orc格式的,不支持删除,如果是textfile格式,上面这种replace写法是可以删除列的。通常情况下不会轻易去删除列的,增加列倒是常见。
5.6 修改表的属性
可以增加附加的表属性,或者修改属性,但是无法删除属性:
- alter table tableName set tblproperties(
- 'key' = 'value'
- );
举例:这里新建一张表:
- create table t8(time string,country string,province string,city string)
- row format delimited fields terminated by '#'
- lines terminated by '\\n'
- stored as textfile;
这条语句将t8表中的字段分隔符'#'修改成'\\t';
- alter table t8 set serdepropertyes('field.delim'='\\t');
大数据技术的战略意义不在于掌握庞大的数据信息,而在于对这些含有意义的数据进行专业化处理。换而言之,如果把大数据比作一种产业,那么这种产业实现盈利的关键,在于提高对数据的“加工能力”,通过“加工”实现数据的“增值”。