hive基础操作

hive数据类型

基本数据类型:

数据类型长度例子
TINYINT1byte有符号整数20
SMALLINT2byte有符号整数20
INT4byte有符号整数20
BIGINT8byte有符号整数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;

分桶十分适合抽样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值