欢迎投稿

今日深度:

hive优化,

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

www.htsjk.Com true http://www.htsjk.com/hive/37364.html NewsArticle hive优化, 1.写udf函数 UDF(User-Defined-Function),用户自定义函数对数据进行处理。 STEP1:创建UDF函数                 ①自定义UDF需要继承org.apache.hadoop.hive.ql.UDF                  ②需要...
相关文章
    暂无相关文章
评论暂时关闭