Hive库、表的特点
- hive有默认库default,如果不指定,则使用的是默认库
- Hive的数据库名、表名都不区分大小写
- 名字不能使用数字开头、不能使用关键字、尽量不使用特殊字符
create table if not exists t1(
uname string comment 'this is name',
chinese int,
math int,
english int
)
comment 'this is my table'
row format delimited
fields terminated by '\t'
lines terminated by '\n'
stored as textfile;
desc database databaseName;
desc database extended databaseName;
describe database extended databaseName;
desc tableName;
desc extended tableName;
describe extended tableName;
- 创建库和表的本质
- 创建数据库,其实就是在hive的参数${hive.metastore.warehouse.dir}对应的目录下,创建一个新的目录,此目录的名称为: 库名.db。
- 创建表,其实就是在对应的数据库目录下面创建一个子目录,目录名为表名。数据文件就存在这个目录下。
- 在创建库或者表时,除了创建目录外,还会在mysql中(元数据库),添加元数据(描述信息)
- 加载数据的方式
- 使用hdfs dfs -put将本地文件上传到表目录下
例如:hdfs dfs -put ./u1.txt /user/hive/warehouse/mydb1.db/ - 在hive中使用load命令
例如:load data [local] inpath ‘文件路径’ [overwrite] into table 表名
- 完整建表语法
create [external] table [IF NOT EXISTS] table_name
[(colName colType [comment 'comment'], ...)]
[comment table_comment]
[partition by (colName colType [comment col_comment], ...)]
[clustered BY (colName, colName, ...)
[sorted by (col_name [ASC|DESC], ...)] into num_buckets buckets]
[row format row_format]
[stored as file_format]
[location hdfs_path]
说明:
1.create table
创建一个指定名称的表,如果已存在相同名字的表的(不区分大小写),则抛出异常;用户可以使用if not exists选项来忽略这个异常
2.external关键字
可以让用户创建一个外部表 ,在建表的同时指定一个指向实际数据的路径(location).
【Hive创建内部表时,会将数据移动到数据仓库指向的路径;
若创建外部表,仅记录数据所在的路径,不对数据的位置做任何的改变。
在删除表的时候,内部表的元数据和实际数据会被一起删除,而外部表只删除元数据,不删除实际数据】
3.like:允许用户复制现有的表结构而不复制数据
4.ROW FORMAT DELIMITED
[FIELDS TERMINATED BY char]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char] | SERDE serde_name
[WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。
如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。
在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive通过 SerDe 确定表的具体的列的数据。
5.store as SEQUENCEFILE|TEXTFILE|RCFILE
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。
如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
6.clustered by
对于每一个表(table)或分区,Hive可以进一步组织成桶,也就是说桶是更细粒度的数据范围划分。
Hive针对某一列进行桶的组织。采用对列值哈希,然后除以桶的个数求余数的方式决定该条记录存放在哪个通中。
7.补充:
把表(或分区)组织成桶(Bucket)由两个理由:
* 获得更高的查询效率:桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。
具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。
比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。
那么将保存相同列值的桶进行JOIN操作就可以,可以大大减少JOIN的数据量。
*使取样(sampling)更高效:在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。