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());
相关文章推荐
- 请求头和响应头的作用和内容
- 详解AJAX工作原理以及实例讲解(通俗易懂)
- Linux php-oracle扩展安装
- iOS程序内实现版本更新
- 菜鸟的自述
- SVM支持向量机算法
- 简单工厂模式(Simple Factory)
- 解读ASP.NET 5 & MVC6系列教程(15):MvcOptions配置
- Ryan的OC学习总结-----7 内存管理
- 常见错误jar包-1
- 实现img,文字平均分布问题解决方案
- ajax入门详解
- Ubuntu下安装Docker并配置Tomacat和jdk.
- Java实验(6) 二次方程类
- Android下opencv开发指导资料Introduction into Android Development
- Windows以及linux系统下如何修改mysql数据库密码
- 面向对象式编程
- ListView中的EditText在编辑后无改变
- (转)OpenGL中位图的操作(glReadPixels,glDrawPixels和glCopyPixels应用举例)
- OSError: [Errno 13] Permission denied: '/home/git/gitosis'