HiveSQL高级进阶技巧

目录

掌握下面的技巧,你的SQL水平将有一个质的提升!

1.删除

正常hive删除操作基本都是覆盖原数据;

sql 复制代码
insert overwrite tmp 
select * from tmp where id != '666';

2.更新:

更新也是覆盖操作;

sql 复制代码
insert overwrite tmp 
select id,label,
       if(id = '1' and label = 'grade','25',value) as value 
from tmp where id != '666';

3.行转列:

思路1:

先通过concat函数把多列数据拼接成一个长的字符串,分割符为逗号,再通过explode函数炸裂成多行,然后使用split函数根据分隔符进行切割;

sql 复制代码
-- Step03:最后将info的内容切分
select id,split(info,':')[0] as label,split(info,':')[1] as value
from 
(
-- Step01:先将数据拼接成"heit:180,weit:60,age:26"
    select id,concat('heit',':',height,',','weit',':',weight,',','age',':',age) as value 
    from tmp
) as tmp
-- Step02:然后在借用explode函数将数据膨胀至多行
lateral view explode(split(value,',')) mytable as info;

思路2:使用union all函数,多段union

sql 复制代码
select id,'heit' as label,height as value
union all 
select id,'weit' as label,weight as value
union all 
select id,'age' as label,age as value

4.列转行:

思路1:多表join,进行关联

sql 复制代码
select 
tmp1.id as id,tmp1.value as height,tmp2.value as weight,tmp3.value as age 
from 
(select id,label,value from tmp2 where label = 'heit') as tmp1
join
on tmp1.id = tmp2.id
(select id,label,value from tmp2 where label = 'weit') as tmp2
join
on tmp1.id = tmp2.id
(select id,label,value from tmp2 where label = 'age') as tmp3
on tmp1.id = tmp3.id;

思路2:使用max(if) 或max(case when ),可以根据实际情况换成sum函数

sql 复制代码
select 
id,
max(case when label = 'heit' then value  end) as height,
max(case when label = 'weit' then value  end) as weight,
max(case when label = 'age' then value  end) as age 
from tmp2 
group by
id;

思路3:map的思想,先拼接成map的形式,再取下标

sql 复制代码
select
id,tmpmap['height'] as height,tmpmap['weight'] as weight,tmpmap['age'] as age
from 
(
    select id,
           str_to_map(concat_ws(',',collect_set(concat(label,':',value))),',',':') as tmpmap  
    from tmp2 group by id
) as tmp1;

5.分析函数:

sql 复制代码
select id,label,value,
       lead(value,1,0)over(partition by id order by label) as lead,
       lag(value,1,999)over(partition by id order by label) as lag,
       first_value(value)over(partition by id order by label) as first_value,
       last_value(value)over(partition by id order by label) as last_value
from tmp;
sql 复制代码
select id,label,value,
       row_number()over(partition by id order by value) as row_number,
       rank()over(partition by id order by value) as rank,
       dense_rank()over(partition by id order by value) as dense_rank
from tmp;

6.多维分析

sql 复制代码
select col1,col2,col3,count(1),
       Grouping__ID 
from tmp 
group by col1,col2,col3
grouping sets(col1,col2,col3,(col1,col2),(col1,col3),(col2,col3),())
sql 复制代码
select col1,col2,col3,count(1),
       Grouping__ID 
from tmp 
group by col1,col2,col3
with cube;

7.数据倾斜

groupby:

sql 复制代码
select label,sum(cnt) as all from 
(
    select rd,label,sum(1) as cnt from 
    (
        select id,label,round(rand(),2) as rd,value from tmp1
    ) as tmp
    group by rd,label
) as tmp
group by label;

join:

sql 复制代码
select label,sum(value) as all from 
(
    select rd,label,sum(value) as cnt from
    (
        select tmp1.rd as rd,tmp1.label as label,tmp1.value*tmp2.value as value 
        from 
        (
            select id,round(rand(),1) as rd,label,value from tmp1
        ) as tmp1
        join
        (
            select id,rd,label,value from tmp2
            lateral view explode(split('0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9',',')) mytable as rd
        ) as tmp2
        on tmp1.rd = tmp2.rd and tmp1.label = tmp2.label
    ) as tmp1
    group by rd,label
) as tmp1
group by label;
相关推荐
山峰哥5 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
William Dawson6 小时前
【踩坑实录|Hive1\.2\.1数据服务接口5大疑难问题调试与全方位优化方案】
java·hive·spring boot
刘婉晴7 小时前
【Web漏洞】SQL 注入实战技巧
前端·数据库·sql
Csvn8 小时前
📊 SQL 入门 Day 13:窗口函数进阶
后端·sql
AI推荐率10 小时前
品牌AI可见度监测报告生成:Python + SQL + Jinja2 自动化实践
人工智能·python·sql
爱喝水的鱼丶11 小时前
SAP-ABAP:调试器高级工具使用——内表分析、SQL追踪、内存检查功能实操
运维·sql·性能优化·sap·abap·经验交流
Csvn1 天前
📊 SQL 入门 Day 12: 窗口函数基础
后端·sql
安_1 天前
MySQL SQL 调优完整指南
数据库·sql·mysql
我命由我123451 天前
SQLite 数据库参数数量超限导致的崩溃问题:SQLiteException: too many SQL variables
java·数据库·sql·java-ee·sqlite·android-studio·android runtime
Lethehong2 天前
【金仓数据库征文】AI 直连国产数据库——KES MCP Server 自然语言查库与 SQL 调优实战
数据库·人工智能·sql·金仓数据库征文