插入(装载)数据
数据在本地或者hdfs中:load data [local] inpath ‘pathname’ [overwrite] into table tablename [partition(column=xxx)]
insert方法:insert into tablename select xx,xx,xxx,xxx,[union all] select xxx,xxx,xx,xxx;
from table_name insert overwrite table table_name [partition(xx,xx)] select xx,xx,xx; 典型的ETL模式
insert into tablename values(coulmmn1 xxx,coulmn2 xx); 指定列插入 ////
insert into tablename(name) value(‘Judy’) 指定值插入
发现插入:with t as(
select 5,‘mm’,‘1994-1-5’,array(‘study’)[union all] select xxx,xxx,xxx,
)
insert into emps select * from t
导出数据
export table table_name [partition(xx=xx,xx=xx)] to ‘/root/output’;
创建表
create table tablename as select * from xxx; CTS
create table tablename as with 【结果集】 CTE
create table tablename like tablename; 复制表结构不复制内容
row format serde ‘org.apache.hadoop.hive.serde2.OpenCSVSerde’ 把csv导入
location ‘/shopping/’ 导入的是文件夹,只能放一个文件
tblproperties (“skip.header.line.count”=“1”) 跳过首行
查询数据
单查 select xx from tablename where xxx;
子查询:with a as(select * from tablename where xxx) select * from a;
: select * from (select * from xxx)a;
删除表
drop table if exists employee[with perge]------------------>with perge 直接删除【可选】否则会放在.Trash目录
alter table tabe_name rename to new_table_name; 更改表名
alter table table_name change old_name new_name string; 更改列名
alter table table_name add columns(work string); 添加列名
alter table table_name replace columns(name string); 替换列名
静态分区(分区:提高查询性能)理解为文件夹
创建表时添加分区字段 patitioned by(column,xxx) 此coulmn 在表中不存在
alter table students add partition(sex=‘m’) partition(sex=‘f’);
show partitions table_name;
insert into students partition(sex=‘m’) select 1,‘zs’;
动态分区 (分区:提高查询性能)
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert into students partition(sex) select 1,‘zs’,‘m’ as sex;
分桶 (按照分桶字段的哈希值取模除以分桶的个数) 理解为文件
好处:1 方便取样 2 提高join查询效率
创建表 clustered by (dept) into 3 buckets 按字段分桶 此字段在表中存在
set hive.enforce.bucketing=true; //让hive强制分桶,自动按照分桶表的bucket 进行分桶。
添加数据自动分桶
基于桶的抽样:select * from table_name tablesmple(bucket 1 out of 3 on xx);
-------------------取样并不是一个精确的操作,因此这个 比例不一定要是桶数的整数倍---------------------
视图 相当于索引)创建视图create view view_name as select xxx ; 删除 drop view xxx;
create view vw_customer_details as
base64(binary(last_name)) as last_name ,
//select unbase64(base64(binary(store_name))) from ext_store_details base64解码
MD5(credit_no) as credit_no
from ext_customer_details
侧视图–lateral view 意义:配合explode ,一个语句生成把单行数据拆解成多行后的数据结果集 。
explode 作用是处理map结构的字段
行转列
select name,myscore from xx lateral view explode(split(score,’,’)) x as myscore;
select split(score,’,’) from xx;字符串分割为数组
列转行
select id,
max(if(course='a ',1,0))a,
max(if(course='b ',1,0))b,
max(if(course='c ',1,0))c,
max(if(course='d ',1,0))d,
max(if(course='e ',1,0))e,
max(if(course='f ',1,0))f
from t_course group by id;
coalesce 相当于mysql中 ifnull
==select nvl(null,1) 如果null是具体的数就返回具体的数。
insert into xx select name,coalesce(chinese,0),coalesce(math,0),coalesce(english,0) from sss
--------------------------------先更改配置文件---------------------创建内部事务分桶表----------------------------
插入操作------>更新操作
列转行 主要collect_list
INPUT__FILE__NAME:Mapper Task的输入文件名称
BLOCK__OFFSET__INSIDE__FILE:当前全局文件位置
select b.userid,if(trantype=1,tranmoney,-tranmoney) from bankcards b;
select * from userinfos u where not exists(select b.userid from bankcards b )where u.userid=b.userid group by b.userid); 不存在也要内外关联 在hive中没有not in
insert overwrite table table_name select xxx; 加载数据
数据倾斜情况以及解决
数据倾斜:数据的分散度不够,数据集中在一台或者几台计算机上计算,计算时间远超过平均计算速度,导致整个计算过程过慢。
hive 中数据倾斜,一般都发生在sql中group和on上,而且数据逻辑绑定比较深。
解决思路:调节参数和调节sql语句
1.当遇到大小表关联时:
在hadoop中可以通过将小表加载到缓存 这种方式就是mapjoin方式
在hive中可以设置 mapjoin set hive.auto.convert.join=true 阈值25M
2.部分数据相对特别少
在mapreduce中 partition 部分自定义哈希
在hive中partition 自定义分区
3.当遇到很多小数据表时:
hive中带来很多的参数和机制来调节数据倾斜
set mapred.max.split.size=100000000;
set mapred.min.split.size=100000000;
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
order by排序 对全局数据进行排序,只有一个reduce工作,速度慢
select * from offers order by case when offerid = 1 then 1 else 0 end;
sort by/distribute by
sort by 只能保证对每个reduce里的字段有序。 可以指定reduce个数 set mapred.reduce.tasks=n 来指定,对输出的数据再执行归并排序。
distribute by 类似于sql中的group by 确保具有匹配列值的行被分区到相同的reducer,不会对每个reducer的输出进行排序。是控制在map端如何拆分数据给reduce端的。hive会根据distribute by后面列,对应reduce的个数进行分发,默认是采用hash算法。
SELECT department_id , name, employee_id, evaluation_scoreFROM employee_hr DISTRIBUTE BY department_id SORT BY evaluation_score DESC;
hive的优化
博客园 知名hive 博主 :扎心了老铁 https://www.jianshu.com/p/daa4e7c86925
Hive 聚合
基础聚合 :
使用内置函数进行数据聚合 比如:max(distinct col)、avg(distinct col)等
select count(null) = 0
count(*) 所有值不全为NULL时,加1操作
count(1) 不管有没有值,只要有这条记录,值就加1
count(col) col列里面的值为null,值不会加1,这个列里面的值不为NULL,才加1
高级聚合
grouping sets 实现对同一数据集进行多重GROUP BY操作
SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a, b), a, b, ( ) )
GROUP BY WITH CUBE|ROLLUP
cube:对分组列进行所有可能组合的聚合
窗口函数
row_number 会生成一列连续的序号,rank()函数出现1 1 3 dense_rank()则出现1 1 2这样的序号
lag是迟滞的意思,也就是对某一列进行往后几行,lead是对某一列提前几行
select username,dept,score, row_number() over() from userinfos order by dept,score
select userid,username,dept,score,row_number() over(partition by dept order by score) from userinfos 不同分区中的升序
在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by order by 的执行。 如果没有分组hive随机分组而不是默认为1
行窗口和范围窗口
UDF函数
maven导入jar包-------------hive-common和 hive-exec
继承UDF类 创建evaluate方法
public class SayHello extends UDF {
public String evaluate(String msg){
return "Hello,"+msg;
}
}
打成jar包 上传到hdfs
创建UDF函数 create [temporary] function [functino_name] as 'class_path' using jar 'hdfs:///xxx/xx.jar'
public class SearchArray extends GenericUDF {
//准备三个工具
private ListObjectInspector array;
private ObjectInspector singleEle;
private ObjectInspector second;
private IntWritable result=new IntWritable(-1);
/**
* 设置本函数的返回值类型
* @param
* @return
* @throws UDFArgumentException
*/
@Override
public ObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {
//对第一个参数强转成集合
array =(ListObjectInspector) args[0];
//获得集合中单个元素
singleEle = array.getListElementObjectInspector();
//获得第二个参数
second = args[1];
return PrimitiveObjectInspectorFactory.writableIntObjectInspector;
}
@Override
public Object evaluate(DeferredObject[] args) throws HiveException {
this.result.set(-1);
Object arr = args[0].get();
Object val = args[1].get();
int len = array.getListLength(arr);
for (int i = 0; i < len; i++) {
Object ele= array.getListElement(arr,i);
if (ele!=null){
if (ObjectInspectorUtils.compare(val,second,ele,singleEle)==0){
this.result.set(1);
break;
}
}
}
return result;
}
//说明文件
@Override
public String getDisplayString(String[] strings) {
return null;
}
}