Hive库、表的特点

  1. hive有默认库default,如果不指定,则使用的是默认库
  2. Hive的数据库名、表名都不区分大小写
  3. 名字不能使用数字开头、不能使用关键字、尽量不使用特殊字符
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;
  1. 创建库和表的本质
  • 创建数据库,其实就是在hive的参数${hive.metastore.warehouse.dir}对应的目录下,创建一个新的目录,此目录的名称为: 库名.db。
  • 创建表,其实就是在对应的数据库目录下面创建一个子目录,目录名为表名。数据文件就存在这个目录下。
  • 在创建库或者表时,除了创建目录外,还会在mysql中(元数据库),添加元数据(描述信息)
  1. 加载数据的方式
  • 使用hdfs dfs -put将本地文件上传到表目录下
    例如:hdfs dfs -put ./u1.txt /user/hive/warehouse/mydb1.db/
  • 在hive中使用load命令
    例如:load data [local] inpath ‘文件路径’ [overwrite] into table 表名
  1. 完整建表语法
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)更高效:在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。