对hive的基本操作有一段时间应用后,再来学习cookbook,对细节进行补充记录
Date/Time 时间数据类型
timestamp数据类型支持不同的转换;可以是整数,距离unix 新纪元时间的秒数 timestamp;浮点数,同整数可解释为距离unix 新纪元时间,精确到纳秒(小数点后9位);字符串,java.sql.timestamp格式,YYYY-MM-DD hh:mm:ss.fffffffff
Date类型用来表示timestamp中的日期部分,格式为 YYYY-MM-DD
hive支持内置函数和UDF实现对时间格式的转换,如函数from_utc_timestamp,to_utc_timestamp
同等操作(same as ):
不等于:!= 、 <>
匹配:RLIKE、REGEXP
区别操作:
匹配:LIKE (SQL正则匹配规则)、RLIKE( JAVA正则匹配规则)
分区查看:SHOW PARTITIONS tb_name ;
多级分区查看:SHOW PARTITIONS tb_name PARTITION( par_col = 'US')、
SHOW PARTITIONS tb_name PARTITION( par_col1 = 'US',par_col2 = 'DC')
ALTER TABLE tab_A EXCHANGE PARTITION (partition_spec) WITH TABLE tab_B;
说明:若表B中已存在与交换分区同名的分区,或者两个表的分区结构不一致,则操作会失败
删除分区时注意选项的设置,
ALTER TABLE tab_name DROP IF EXISTS PARTITION partition_spec,....[IGNORE PROTECTION] [PURGE]
内部表(管理表)而言,删除分区会同时删除实际数据和分区元信息。
若配置了.Trash回收,则删除的分区数据会移动到.Trash/Current目录;若想跳过回收站,在ALTER 命令后加PURGE选项,被删除的分区数据会跳过回收站,不过也意味着无法恢复误删分区
分区优劣:分区有利于数据隔离、优化查询。但是分区前必须考虑合理划分分区的个数,将数据划分为有限的分区。默认情况下,hive也会限制动态分区的最大分区数,避免由于分区过多,超出文件系统处理能力带来的一些问题。且并非所有的数据集都可以划分为合理的分区
分桶:将数据集划分为更容易管理的若干个部分,桶的概念是基于hash 原则设计的,同类型的key值将会发送到同一个bucket。当insert数据时,可由以下公式计算应该插入到哪个bucket中;
设置属性:set hive.enforce.bucketing=true;
CREATE [EXTERNAL] TABLE [db_name.]table_name
[(col_name data_type [COMMENT col_comment], ...)]
CLUSTERED BY (col_name data_type [COMMENT col_comment], ...)
INTO N BUCKETS;
分桶列及桶个数:建表时基于CLUSTERED BY语句中的列建立Bucket;并在建表语句中确认Bucket的个数
分桶表的两个注意点:
Create database if not exists Hive_learning
Comment 'This is my first DB'
Location '/my/directory'
With dbproperties ('Created by' = 'User', 'Created on' = '1-Jan-2015');
建库时指定comment、Location、DBpeoperties
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
选项restrict,当库中有一个或多个表时,数据库不被删除,是默认选项;cascade用来在删库前,删除库中所有表
查看结构:DESCRIBE DATABASE [EXTENDED] db_name; --extended 可选
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS]
[db_name.] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)]
INTO num_buckets BUCKETS]
[SKEWED BY (col_name, col_name, ...)
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]
[
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement];
注意选项和顺序!!
Truncate 命令,删除表中所有行(包括分区行),但是保留表结构
show tables 'a*' :可匹配多个以a开头的表
show create table tb_name:可查看建表语句
本地或HDFS: load data [local] inpath
注意点:load local inpath 语句对集群版hive执行时,本地目录必须是在启动hiveserver2服务的节点本地,其余集群客户端等会报“Invalid path '/path':No files matching path file”异常
解决方法:将非hiveserver2节点本地数据文件,上传到hdfs上,并注意目录权限问题,可进行加载
分区插入数据:insert [overwrite] table tab_name PARTITIOND( par_desc) select col_name,...FROM tabd_name2 WHERE ...;
由查询向本地文件写数据:insert overwrite directory SELECT ...
更新表中列值
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
DETELE操作是关系型数据库中删除数据的,可用于满足ACID特性的表
DELETE FROM tablename [WHERE expression]
RegexSerDe:正则表达式匹配hive表的输入格式,以及查询输出的格式
CREATE TABLE web_logs(remote_ip STRING,dt STRING,httpmethod STRING,request
STRING,protocol STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES("input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (?:-|\[([^\]]*)\])
([^ \"]*|\"[^\"]*\") (-|[0-9]*)",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s"
);
ROW_NUMBER() 、RANK() 、NITLE()、
CUME_DIST():累积分布函数
指定数据窗口,便于执行聚合或者其他分析操作,函数如:LEAD()、LAG()、FIRST_VALUE()、LAST_VALUE()
关键字: function() OVER (PARTITION BY ..,.. ORDER BY ... [ROWS BETWEEN ... AND ...])
STORED AS或者INPUT FORMAT 指定文件存储格式
ORC格式:高效存储和处理数据,在读写和处理上性能较优。
主要介绍cross join、map-side join、bucket map join、skew join
hive仅支持基于相等条件列的join操作,不能执行类似a.collumn <> b.cloumn的join,这点与RDBMS不同
left semi join:是IN 或EXISTS操作的替代,注意:右表只能在JOIN条件中使用,不能在select 或where子句中使用
cross join:笛卡尔积 join,左表和右表的每个元素进行组对
map-side join:小表、大表关联问题。小表缓存到memory,大表在mappers中流转,不使用reducers,提高产生结果集的效率
属性设置set hive.auto.convert.join=true;
mapjoin操作之前不支持union、join、mapjoin操作;之后不支持union、lateral view 、reduce sink
bucket map join :大小表、且均为分桶表时,通过设置属性,对两个表的桶个数必须是倍数关系
bucket sort merge map join:表数据是基于join列的分桶、且是有序的Bucket columns==Join Columns==Sort Columns;两个表有相同的桶数;
skew join:用于数据倾斜问题,表中关键数据列在某一个值上的记录数较多时,可将特殊列设置到一个单独的reducer进行处理,reduce过程应用skew join
tables and partitions:
The number of rows
The number of files
Size in bytes
Max, min, and average row sizes
Max, min, and average file sizes
The number of partitions (in the case of tables)
例:ANALYZE TABLE sales COMPUTE STATISTICS;
ANALYZE TABLE sales_part PARTITION(pid) COMPUTE STATISTICS;
ANALYZE TABLE t1 [PARTITION p1] COMPUTE STATISTICS FOR [COLUMNS c1, c2..]