您的位置:首页 > 其它

Hive 学习笔记(一)

2016-06-24 14:57 260 查看

DataType 数据类型

hive支持以下数据类型:

有符号整数: BIGINT(8 字节),INT(4字节),SMALLINT(2字节)、TINYINT(1字节)

浮点数:FLOAT 、 DOUBLE

BOOLEAN:FLASE、TRUE

STRING

MAP:无序键值对。键的类型必须是原子的,值可以是任意类型,同一个映射的键的类型必须相同,值的类型也必须相同

ARRAY: 有序列表,所有元素都必须是相同类型

STRUCT:复杂类型,字段的类型可以不同

操作符和函数

hive提供了普通的sql操作,包括关系操作、算数操作以及逻辑操作。

hive也提供了很多内置函数,可以通过命令 show functions; 查看。这些函数可以分成几大类,包括数学和统计函数、字符串函数、日期函数、条件函数、聚集函数以及处理xml和JSON的函数。



如果想知道某个函数的功用,可以通过命令查询,如上。

table 表

hive的表在逻辑上有存储的数据和描述表中数据形式的相关元数据组成。数据一般存储在HDFS中,元数据存放在关系型数据库中。

Managed 表 and External 表

ps: 一般翻译为 托管表和外部表

在Hive中创建表时,默认情况下Hive负责管理数据。这意味着Hive把数据移入它的 “仓库目录”。另一种选择是创建一个“外部表”。这会让Hive到仓库目录以外的位置访问数据。

创建托管表:

CREATE TABLE users(id INT,name STRING);
LOAD DATA INPATH '/user/hive/users'  OVERWRITE INTO TABLE users  ;


创建表users,并把数据移动到 warehouse目录下。

丢弃表:

DROP table users;


这个表的元数据和数据,会被一起删除。

LOAD 加载操作是文件系统中的文件移动或者文件重命名。Hive并不检查表目录中的文件是否符合未表所声明的模式,如果有数据和模式不匹配,只有在查询是才会知道。通常查询时返回NULL时,表示字段缺失或者不匹配。

创建外部表:

CREATE EXTERNAL TABLE users(id INT,name STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/hive/users' ;
LOAD DATA INPATH '/user/hadoop/users.txt' INTO TABLE users  ;


使用EXTERNAL 关键字,表示创建外部表。并且在创建时,Hive并不会检查这一外部位置是否存在。Drop外部表时,Hive只会删除元数据。

partition 和 bucket

使用分区可以加快数据分片的查询速度。表或分区可以进一步分为bucket,可以未数据提供额外的结构以获取更高效的查询处理。

partition

以日志文件举例:日志文件中每条记录包含一个时间戳。如果根据日期进行分区,那么同一日期的记录就会被存放在同一个分区中。优点: 对于限制到某个或某些特定日期的查询,处理将会更加高效。一个表可以以多个维度进行分区。

分区是创建表时使用 PARTITIONED BY 定义。

CREATE EXTERNAL TABLE IF NOT EXISTS logs_static (
ip STRING,
status INT)
PARTITIONED BY (year INT, month INT, day INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/user/hadoop/logs/logs_static';


查看表的描述:



在HDFS中,会创建如下文件



查询:



bucket

把表或者分区组织成 桶有个理由。第一个理由是获得更高的查询处理效率。第二个理由是可以使 取样(sampling) 操作更加高效。

CLUSTERED BY 定义如何划分桶以及桶的个数。

CREATE TABLE bucketed_users (id INT, name STRING)
CLUSTERED BY (id) SORTED BY (id ASC) INTO 4 BUCKETS;


这里,使用ID确定如何分桶(Hive对值进行哈希并将结果除以桶的个数取语数)。桶中的数据可以根据一个或者多个列另外进行排序。这样对每个桶的连接成了高效的 归并排序,因此可以进一步提升map端连接的效率。

将users表中的数据灌入 分桶表:

INSERT OVERWRITE TABLE bucketed_users
SELECT * FROM users;


分桶完成后,Hive会在HDFS上创建4个数据文件。



查询:

select * from bucketed_users tablesample(bucket 2 out of 2 on id);


tablesample 表示对表进行取样。桶的个数从2开始计数,返回表中约1/2的数据行。因为查询只需要读取和tablesample 子句匹配的桶,所以取样分桶表是非常高效的操作。如果使用rand() 函数对没有划分成桶的表进行取样,即使只需要读取很小一部分样本,也要烧麦整个输入数据集。

select * from users tablesample (bucket 1 out of 4 on rand());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: