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)更高效:在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。