hive数据类型
基本数据类型:
数据类型 | 长度 | 例子 |
---|---|---|
TINYINT | 1byte有符号整数 | 20 |
SMALLINT | 2byte有符号整数 | 20 |
INT | 4byte有符号整数 | 20 |
BIGINT | 8byte有符号整数 | 20 |
BOOLEAN | 布尔类型 | TRUE |
FLOAT | 单精度浮点数 | 3.1419 |
DOUBLE | 双精度浮点数 | 3.14159 |
STRING | 字符序列。可以指定字符集。可以使用单引号或者双引号 | |
TIMESTAMP | 整数,浮点数或者字符串 | (JDBC所兼容的java.sql.Timestamp时间格式) |
BINARY | 字节数组 |
集合数据类型:
数据类型 | 长度 | 例子 |
---|---|---|
STRUCT | 和c语言中的struct或者对象类似 | struct(‘John’, ‘Doe’) |
MAP | 键值对集合 | map(‘first’, ‘JOIN’, ‘last’, ‘Doe’ |
ARRAY | 数组集合 | Array(‘John’, ‘Doe’ |
hive分区
hive分区可以加快查询速度
通过将分区表设置为strict模式可以避免查询时没有使用分区过滤:set hive.mapred.mode=strict;
SHOW PARTITIONS
可以查看表中存在的所有分区。
操作表
修改列信息
ALTER TABLE log_messages
CHANGE COLUMN hms hours_minutes_seconds INT
COMMENT ' '
AFTER serverity
after是将列移动到serverity字段后面
数据操作
向管理表中装载数据
向分区中加载数据的方式:
LOAD DATA LOCAL INPATH '${env:HOME}/california-employees'
INTO TABLE employees
PARTITION (country = 'US', state = 'CA');
'${env:HOME}/california-employees’是要加载的文件路径,employees是装载数据的表,最下面的partition是加载的分区。
local代表是本地的文件系统路径,没有local的话就是分布式文件系统的路径。
添加分区使用:ALTER TABLE tablename ADD PARTITION(pt=) LOCATION 'hdfs://master_server/data/log_messages/2012/01/02';
通过查询语句向表中插入数据
动态分区插入
INSERT OVERWRITE TABLE employees
PARTITION (countyr, state)
SELECT ..., se.cnty, se.st
FROM staged_employees se;
插入时添加partition会自动根据分区字段对数据进行分区。
创建表并加载数据
CREATE TABLE table
AS SELECT column
FROM table;
导出数据
可以直接拷贝到文件夹:
hadoop fs -cp source_path target_path
还可以使用INSERT…DIRECTORY…:
INSERT OVERWRITE LOCAL DIRECTORY 'target_path'
SELECT column
FROM tablename
查询
表生成函数
联结
hive不支持非等值联结。
联结优化
- hive做联结操作时,会先对前面的表缓存,然后扫描最后一张表。所以,联结的时候最好保证联结查询中的表的大小从左往右是依次增加的
- 如果表中有一张是小表,可以在最大的表通过mapper的时候将小表完全放到内存中。Hive可以在map端执行联结过程(map-side Join),这是因为Hive可以和内存中的小表进行逐一匹配,从而省略常规联结操作所需要的reduce过程。
左半开联结(LEFT SEMI JOIN)
hive中是不支持使用in…exists结构的,但是可以使用LEFT SEMI JOIN来查询左边表中对于右边表满足on条件的记录。
sort by
order by 是对全局的数据进行排序,sort by 是对每一个reducer中的数据进行排序,也就是局部排序。
含有sort by的distribute by
通常sort by会让每一个reducer中的数据是有序的,但是每一个reducer中会有很多重复数据,如果要让每一个reducer处理具有一些相同特征的数据,可以添加distribute by
distribute by语句需要写在sort by语句前面
cluster by
如果sort by和distribute by的字段是一样的,并且按照默认顺序排序,那么可以直接使用cluster by代替。但是cluster by会剥夺sort by的并行性,但是这样可以实现数据全局排序。
hive模式
同一份数据多种处理
FROM history
INSERT OVERWRITER sales SELECT * WHERE action='purchased'
INSERT OVERWRITER credits SELECT * WHERE action='returned';
分区与分桶
在有些时候,分区可能会导致出现过多的小分区。比如如果对user_id分区的话会出现很多小分区,有可能会导致超过文件系统的处理能力。这种情况下一个更合理的方式是分桶,分桶会将指定的字段值进行哈希然后分到不同的桶中。比如对user_id分桶,同一个user_id会被分到一个桶中,假设用户数比桶数多得多,就会在一个桶中放多个用户。
CREATE TABLE weblog (user_id INT, url STRING, source_ip STRING)
PARTITIONED BY (dt STRING)
CLUSTERED BY (user_id) INTO 96 BUCKETS;
可以设置一个属性来强制hive为目标桶的分桶初始化过程设置一个正确的reducer个数:
SET hive.enforce.bucketing = true;
如果不设置这个属性,就需要自己指定与分桶个数相匹配的reducer个数:
SET mapred.reduce.tasks=96;
分桶十分适合抽样。