数据处理奇技巧——hive篇

1、pmod(int a, int b):返回a除以b的余数的绝对值;

cast(aaa as int):将string转化成int;

cast(aaa as decimal(10, 2)):将string转化成float,保留两位小数;

2、trim(String A):去除A两侧的空格;

ltrim(String A):去除左边空格;

rtrim(String A):去除右边空格

select trim('abc') from lxw_dual;

3、concat_ws (separator,str1,str2,...) :根据固定的分隔符连接后侧字符串;

concat_ws第一个参数是其它参数的分隔符,分隔符的位置放在要连接的两个字符串之间,分隔符可以是一个字符串,也可以是其他参数。

select concat_ws(',','11','22','33');    11,22,33

4、collect_list/collect_set列转行函数:

在本地文件系统创建测试文件:

存储在hive表中:

按用户分组,取出每个用户每天看过的所有视频的名字:

上面结果中,由于霸王别姬李四看了两遍,所以列表中存在重复,去重处理collect_set()

突破group by限制:

还可以利用collect来突破group by的限制,hive中在group by查询的时候要求出现在select后面的列都必须出现在group by的后面

即select列必须作为分组依据的列,但有的时候我们想根据A分组然后随便取出每个分组中的一个B,带入到这个实验中就是按照

用户进行分组,然后随便拿出一个他看过的视频名称即可:

eg:

collect_list:该函数功能等同于collect_set,唯一的区别在于collect_set会去除重复元素,collect_list不去除重复元素,示例sql如下

with t as ( select 1 id,123 value union all select 1 id,234 value union all select 2 id,124 value union all select 2 id,124 value ) select t.id,collect_set(t.value),collect_list(t.value) from t group by t.id

collect_set:

该函数只接受基本的数据类型,主要作用是将某字段的值进行去重汇总,返回值是array类型字段

with t as ( select 1 id,123 valu union all select 1 id,234 value union all select 2 id,124 value ) select t.id,collect_set(t.value) from t group by t.id

5、get_json_object(string json_string,string path):

该函数的第一个参数是json对象变量,第二个参数使用$表示json变量标识,然后用.或[]读取对象或数组

select get_json_object(pricecount,'$.buyoutRoomRequest') new_id,pricecount from table_sample a where d='2018-08-31' limit 100

6、json_tuple(string json_string,string k1,string k2...)

该函数的第一个参数是json对象变量,之后的参数是不定长参数,是一组键k1,k2...,返回值是元组,该方法比get_json_object高效,因为可以在一次调用中输入多个键值

select m.*,n.pricecount from (select from table_sample a where d='2018-08-31' limit 100)n lateral view json_tuple(pricecount,'paymentType','complete') m as f1,f2

7、split(str,regex):数据切分。

Splits str arround occourances that match regex.该函数第一个参数是字符串,第二个参数是设定的分隔符,通过第二个参数把第一个参数做拆分,返回一个数组

select split('123,3455,2568',',') select split('sfas:sdfs:sf',':')

8、explode():

该函数接收一个参数,参数类型需是array或者map类型,该函数的输出是把输入参数的每个元素拆成独立的一行记录。

select explode(split('123,3455,2568',','))

9、lateral view():

Lateral View 一般与用户自定义表生成函数(如explode())结合使用。UDTF为每个输入行生成零个或多个输出行,Lateral view首先将UDTF应用于基表的每一行,然后将结果输出行连接到输入行,已形成具有提供的表别名的虚拟表。

select j.nf,p.* from ( select m.*,n.pricecount from (select * from ods_htl_htlinfogoverndb.buyout_appraise a where d =

'${zdt.format("yyyy-MM-dd")}' limit 100)n lateral view json_tuple(pricecount,'paymentType','complete') m as f1,f2 )p lateral view explode(split(regexp_replace(p.f1,'\\[|\\]',''),',')) j as nf

结合:hive中行变列和列变行的函数:

collect_list()与collect_set()是将数据列变行;

explode()与lateral view是将数据行变列;

eg:

select items_page, num

from data_limit

lateral view explode(items_pages) good as items_page

其中:

1)explode是将items_pages行变列;

2)good是虚拟表,用来存储explode之后的数据,并定义列名为items_page;

3)lateral view是将items_page与上面的字段num进行笛卡尔积,呈现出多列表示;

10、str_to_map(String text,String delimiter1,String delimiter2)

使用两个分隔符将文本拆分成键值对。Delimiter1将文本分成k-v对,Delimiter2分割每个k-v对。对于delimiter1的默认值是',',delimiter2的默认值是'='.

select str_to_map('abc:11&bcd:22', '&', ':')

11、array_contains(Array<T>,value)

该函数的用来判断Arrary<T>中是否包含元素value,返回值是boolean

select array_contains(array(1,2,3,4,5),3) true

12、percentile(expr,pc):

该函数用来计算参数expr的百分位数,expr:字段类型必须是INT,否则报错;pc:百分位数,已数值形式传入

13、percentile_approx(expr,pc,[nb])

该函数也是用来计算参数expr的百分位数,但数据类型要求没有percentile严格,该函数数值类似类型都可以;pc:百分位数,可以以数组形式传入,因此可以一次性查看多个指定百分位数;[nb]:控制内存消耗的精度,选填

14、数学函数:

(1)round:四舍五入 select round(数值,小数点位数);

(2)ceil:向上取整 select ceil(45.6); 

(3)floor:向下取整 select floor(45.6); 

15、字符函数:

(1)lower:转成小写

     select lower('Hive'); --hive

(2)upper:转成大写

     select lower('Hive'); --HIVE

(3)length:长度

     select length('Hive'); --4    

(4)concat:拼接字符串

    select concat('hello','Hive'); --helloHive

(5)substr:求子串

     select substr('hive',2); --ive

     select substr('hive',2,1); --i

 (6)trim:去掉前后的空格

    select trim('  hive   '); -hive

 (7)lpad:左填充

      对hive填充到10位,补位用#

     select lpad('hive',10,'#'); --######hive

 (8)rpad:右填充

       select rpad('hive',10,'#'); --hive######

16、日期函数:

(1)to_date

    select to_date('2015-06-01 15:34:23'); --2015-06-01

(2)year

    select year('2015-05-22 15:34:23'); --2015

(3)month

    select month('2015-05-22 15:34:23'); --5

(4)day

    select day('2015-05-22 15:34:23'); --22

(5)weekofyear

    select weekofyear('2015-05-22 15:34:23'); --21

(6)datediff(date,date1):日期差,即两个日期差几天,months_between(date,date1),两个日期差几月,用法一致。

    select datediff('2015-05-22 15:34:23','2015-05-29 15:34:23'); --[-7]

(7)date_add:在现在日期上增加天数,add_months是增加月份,用法一致。

    select date_add('2015-05-22 15:34:23',2); --2015-05-24

(8)date_sub:在现在日期上减少天数

    select date_sub('2015-05-22 15:34:23',2); --2015-05-20

(9)date_format(string/date,dateformate):把字符串或者日期转成指定格式的日期。

select date_format('2018-09-12','yyyy-MM-dd HH:mm:ss') as date_time,date_format('2018-09-12','yyyyMMdd') as date_time1 from dual;--2018-09-12 00:00:00

(10)unix_timestamp(date,dateformat):日期格式转化为时间戳,如果括号内没有参数则表示返回当前的时间戳。

select unix_timestamp() as time_stamp,unix_timestamp('2018-09-26 9:13:26','yyyy-MM-ddHH:mm:ss') as time_stamp1 from dual;

(11)from_unixtime(timestamp,dateformat):将时间戳转化为日期格式,格式必须是10位,毫秒级的时间戳需要用cast转化成秒级。

select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss') asdate_time,from_unixtime(1537924406,'yyyy-MM-dd') as date_time1 from dual;

from_unixtime(cast(unix_timestamp()/1000 as int),'yyyy-MM-dd HH:mm:ss') as date_time

(12)last_day(date):获取月末最后一天:

select last_day('2018-09-30') as date_time,last_day('2018-09-27 21:16:13') as date_time1 from dual;--2018-09-30

(13)trunc(date,format) format:MONTH/MON/MM, YEAR/YYYY/YY:返回月初、年初

select trunc('2018-09-27','YY') as date_time,trunc('2018-09-27 21:16:13','MM') as date_time1 from dual;

--2018-01-01和2018-09-01

(14)next_day(date,formate) format:英文星期几的缩写或者全拼:当前日期下个星期X的日期。

select next_day('2018-09-27','TH') as date_time,next_day('2018-09-27 21:16:13','TU') as date_time1 from dual;

--2018-10-04和2018-10-02

17、常用函数上:https://blog.csdn.net/Forever_ck/article/details/85268145

常用函数下:https://blog.csdn.net/Forever_ck/article/details/85268773

常用函数总结:https://blog.csdn.net/weixin_41907511/article/details/84826469

18、条件函数:

select nvl(T v1, T default_value); -- 如果v1不为null,返回v1否则defaultV

select if(boolean testCondition, T valueTrue, T valueFalseOrNull); --if条件判断表达式

select coalesce(T v1, T v2, T v3, ...); --返回第一个不为null的value值

19、UNION ALL

是上下关联两个hive表,其中各个关联部分的字段名称必须一致,否则报错;

20、删除表信息:

-- 删除库

drop database if exists db_name;

-- 强制删除库

drop database if exists db_name cascade;

-- 删除表

drop table if exists employee;

-- 清空表

truncate table employee;

-- 清空表,第二种方式

insert overwrite table employee select * from employee where 1=0;

-- 删除分区

alter table employee_table drop partition (stat_year_month>='2018-01');

-- 按条件删除数据

insert overwrite table employee_table select * from employee_table where id>'180203a15f';

21、row_number()函数:

row_number() over(distribute by col1 sort by clo2 desc)

22、正则表达式的应用:

regexp_extract(string subject, string pattern, int index)函数的应用;

将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

select clientcode

,regexp_extract(filterlist,'(filtertype"\\:")(\\d+)(",)',2) as filtertype

,regexp_extract(filterlist,'(filtername"\\:")((\\W*\\w*)|(\\W*))(",)',2) as filtername

,regexp_extract(filterlist,'(filtertitle"\\:")((\\W*\\w*)|(\\W*))(",)',2) as filtertitle

,regexp_extract(filterlist,'(filterid"\\:")(\\d+\\|\\d+)(",)',2) as filterid

from tmp_action_click

发布了137 篇原创文章 · 获赞 93 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/livan1234/article/details/103837446