hive优化,
1.写udf函数
UDF(User-Defined-Function),用户自定义函数对数据进行处理。
STEP1:创建UDF函数
①自定义UDF需要继承org.apache.hadoop.hive.ql.UDF
②需要实现evaluate函数
STEP2:将udf打jar包,并上传到hive server上
STEP3:进入hive客户端,添加jar包:hive>add jar ${HIVE_HOME}/jar/udf_test.jar;
STEP4:创建临时函数:
hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';
STEP5:使用UDF函数
hive>SELECT add_example(score) FROM scores;
STEP6:销毁临时函数
hive> DROP TEMPORARY FUNCTION add_example;
2.写udaf函数
UDAF(User- Defined Aggregation Funcation)用来实现HQL没有的聚类函数。
STEP1:创建UDAF函数
①自定义UDAF需要继承UDAF类,内部类Evaluator实现UDAFEvaluator接口
②需要实现 init、iterate、terminatePartial、merge、terminate这几个函数
STEP2:将udaf打jar包,并上传到hive server上
STEP3:进入hive客户端,添加jar包:hive>add jar ${HIVE_HOME}/jar/udaf_test.jar;
STEP4:创建临时函数:
hive>CREATE TEMPORARY FUNCTION avg_example AS 'hive.udaf.avg;
STEP5:使用UDAF函数
hive>SELECT avg_example(col1) FROM scores;
STEP6:销毁临时函数
hive> DROP TEMPORARY FUNCTION avg_example;
3.写udtf函数
UDTF(User-Defined Table-Generating Functions) 用来解决 输入一行输出多行(On-to-many maping) 的需求。
STEP1:创建UDTF函数
①自定义UDTF需要继org.apache.hadoop.hive.ql.udf.generic.GenericUDTF
②需要实现initialize, process, close三个方法
STEP2:将udtf打jar包,并上传到hive server上
STEP3:进入hive客户端,添加jar包:hive>add jar ${HIVE_HOME}/jar/udtf_test.jar;
STEP4:创建临时函数:
hive>CREATE TEMPORARY FUNCTION serial AS 'hive.udtf.add';
STEP5:使用UDTF函数
有两种使用方法,一种直接放到select后面,一种和lateral view一起使用
STEP6:销毁临时函数
hive> DROP TEMPORARY FUNCTION serial;
4.join优化
效果最差:
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id
where t1.date = "2016-06-01"
效果一般:
SELECT *
FROM ( SELECT * FROM a WHERE date = "2016-06-01") t1
JOIN b t2
ON t1.id = t2.id;
效果最好:
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id and t1.date = "2016-06-01";
5.同时删除多个分区
ALTER TABLE dm_predict.waybill_info_d DROP PARTITION (task_type='order',inc_day>'20181111');
6.分区表增加字段
需要将修改的表之前的分区删除掉再加工数据。
否则新加工的数据增加的字段无法添加到分区表中。
7.locate函数
select locate('a','abcd'), locate('b', 'abcd'), locate('f', 'abcd')
结果: 1 2 0
8.
drop table if exists k1.t1;
create table if not exists k1.t1(
name string comment '名字',
)
partitioned by (inc_day string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat';
9.分区表相关操作
#添加一个分区
alter table my_partition_test_table if not exists add partition (p_hour='2017113003', p_city='573', p_loctype='MHA');
#删除单个分区
show partitions dm_analysis.transfer_field_daily_analysis;
alter table dm_analysis.transfer_field_daily_analysis drop if exists partition(inc_day='20180712');
# 删除多个分区
ALTER TABLE dm_analysis.sdj_jlyc_day_zonecode_sub DROP PARTITION (inc_day >='20181123',task_type='shou');
ALTER TABLE dm_analysis.sdj_jlyc_day_zonecode_sub DROP PARTITION (inc_day >='20181123',task_type='delivered');
----结论是,根据id分组,就算time_test排序相同,只会有一个第一名
select *,row_number() over(partition by id order by time_test desc) as rn
from dm_analysis.waybill_info_d_test_row_number;
10.导入数据到hive表中
1.上传csv文件
1.1 进入测试环境bdp DataIDE
http://bdp.sit.sf-express.com/ide/#/
1.2 点击文件管理
将本地的2015-05.csv上传到/user/upload路径上
2.创建hive表
drop table dm_analysis.lsm_deep_model_predict;
create table dm_analysis.lsm_deep_model_predict
(
`id` string COMMENT 'ID'
, `dates` string COMMENT '日期'
, `ware_loc` string COMMENT '网点'
, `amount` string COMMENT '数量'
, `day_of_week` string COMMENT '周几'
)
partitioned by (inc_day string)
ROW FORMAT delimited fields terminated by ',';
ps:因为.csv文件时以,进行分割,所以建表语句最后一行就是根据,号识别数据,否则数据无法导入。
drop table if exists tmp_dm_analysis.sdj_jlyc_type_zone_day_mape;
create table tmp_dm_analysis.sdj_jlyc_type_zone_day_mape
(
includ_type String,
dept_type_name String,
dept_name String,
zonecode String,
days String,
cn bigint,
yhat bigint,
mape float
) partitioned by (inc_day String, task_type String)
ROW FORMAT delimited fields terminated by ',';
3.将数据存到hive表中
set hive.exec.dynamic.partition.mode=nonstrict;
Load data inpath '/user/upload/my_train.csv' INTO Table dm_analysis.lsm_deep_model_predict partition (inc_day='20180622');
11.查找hive表中一个字段相同,但是另外一个字段不同的
select * from
(
select t1.app_id as app_id_1,t2.app_id as app_id_2,t1.source as source1,t2.source as source2
from a t1
left join b t2
on t1.app_id=t2.app_id
) t
where app_id_1=app_id_2 and source1!=source2
limit 5;
11.记录一下重大的bug错误
发现数据加工老是卡在reduce 98%,一方面是要检查是否发生数据倾斜,另一方面要查看表关联是否正确。哎,因为关联字段错误,导致永远无法加工到第三张表,所以会报错。一定切记,自己犯下的这个超级大的bug