hive SQL 技巧积累

2 篇文章 0 订阅

一、row_number() over(parttition by order by) 里分区字段可以是多个。

二、left join的字段可以是两个,其中一个可以是小于不一定都要等于。比如用两个表的时间做筛选,在主键id相同的情况下,可以以一个表的时间做基点,另一个表的时间小于他的做聚合,然后选出最小于他的最大时间。

三、多行聚合拼接:按照id聚合group by ,将需要选择合并的字段concat起来,作为你想要存放的字段。

1.c是去掉首尾的拼接符号,concat是普通拼接。

2.collect_set(collect_list类似,区别set去重) ,可以突破group by只能选择被聚合字段和聚合函数的限制。

SELECT id,
concat_ws('|', collect_set(str)) 
FROM t  
GROUP BY id;

这里collect_set是主要的,concat只是辅助将集合起来的元素拼接起来。

SELECT  deal_id
        ,concat(
            '['
            ,concat_ws( ',' ,collect_set( f1(inv_id,inv_name,inv_type) ) )
            ,']'
        ) AS investors
FROM    (
            SELECT  t1.deal_id AS deal_id
                    ,t1.inv_name
                    ,t1.inv_type
                    ,IF(
                        t2.legal_id IS NULL
                        ,inv_id
                        ,IF(t1.inv_type =3, t2.legal_id,inv_id)
                    ) AS inv_id
            FROM     t1
            LEFT JOIN  t2
            ON      t1.inv_id = t2.brand_id
        ) t3
GROUP BY deal_id

四、一行转多行

1、问题
hive如何将

a b 1,2,3
c d 4,5,6

变为:

a b 1
a b 2
a b 3
c d 4
c d 5
c d 6

答案

select col1, col2, col5
from tmp_bsf_test a
lateral view explode(split(col3,’,’)) b AS col5

注意:1.lateral view explode 要放在from后面,而不能放在select 里面。

           2.b一开始不知道是什么东西,列的别名col15可以理解,但是b不能理解,原来b是给打散的结果存的一个临时虚拟表,这也敲好印证了为什么1中选择不能放在select后面。

五、if(条件1,结果1,结果2)语法格式

六、cast(col1 as double)语法格式

七、null的格式一般是随列的属性而变的。如union时,为了拼接字段,有时需要加上null,这时null的属性就跟存在属性的部分一致。

但是如果直接选择 creat view view1 as select null from t ,就会报格式错误。应该将这里的null cast 成固定格式。

八、round(col1,6) 保留6位小数

九、get_json_object(col1,"$json_key")

十、split_part分(col1,"-",1)分割后取第一个结果(从1开始数而不是0)     

十一、translate  : TRANSLATE(char, from, to)

select translate('abcdefga','abc','wo') 返回值 from dual;

https://www.iteblog.com/archives/1639.html这总结的比较全

十二、translate和regex_replace的区别

regex_replace(source_string,pattern,repalce_string) 对source_string字段中符合pattern正则格式的,替换为replace_string

translate(chars1,chars2) 用chars1来替换chars2中对应位置的字符,一一对应替换。

十三、求日期差函数

1.日期比较函数: datediff语法: datediff(string enddate,string startdate)
返回值: int
说明: 返回结束日期减去开始日期的天数。
例如:hive>select datediff('2018-12-22','2018-12-12')
结果为:1
2.日期增加函数: date_add语法: date_add(string startdate, intdays)
返回值: string
说明: 返回开始日期startdate增加days天后的日期
例如:hive>select date_add('2018-12-12',12)
结果为:2018-12-24
3.日期减少函数: date_sub语法: date_sub (string startdate,int days)
返回值: string

说明: 返回开始日期startdate减少days天后的日期。
例如:hive>select date_sub('2018-12-24',10)
结果:2018-12-14
 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值