hive个人使用 持续更新

这篇博客详细介绍了作者在使用Hive过程中积累的各种实用技巧,包括如何处理连续n天的数据、添加滚动总计、数据类型转换、使用CASE WHEN语句、数据脱敏、自定义函数、SQL执行顺序优化、join操作优化以及时间戳格式转化等,对于Hive初学者和进阶用户都具有很高的参考价值。
摘要由CSDN通过智能技术生成
  • 1、连续n天
例如连续12登陆,先日期进行从小到大进行排序,再rank ,然后日期减去rank的序号,有多少个相同的连续值就是连续多少天
  • 2、数据只有本月和本月数添加第三列是之前12个月的数总和
(sum(ct2.CREATE_PROJECT_CURRENT_MONTH_CNT) over(ORDER BY ct2.CURRENT_MONTH_ID ASC ROWS BETWEEN 12 preceding AND 1 preceding)
如果原始数据有缺失月份可以先进行缺失月份的补齐默认值补0
  • 3、数据只有本月和本月数添加第三列是上个月数第四列上年同月数
使用left join 配合case when 使用 灵活填充
  • 4、数据只有本月和本月数添加第三列是本年截止当前数总和
 通过年 来进行分组 
  • 5 、列转行 行转列
 concat(固定字符串)
 concat_ws(集合)
 collect_set()
 collect_list()
 lateral view explode(集合)
 lateral view explode(split(order_value,','))
  • 6、数据类型转换
cast(xxx as xxx)
  • 7、case when 灵活方式使用

  • 8、脱敏

这是使用sql 的方式进行脱敏
regexp_replace(selphone,substr(selphone,4,4),'****')
还可以把脱敏封装为函数,手机号,身份证号,姓名,银行卡号等,需要脱敏时直接调用函数。

-9、自定义函数

## 临时函数使用

进入hive的交互shell中

1. 上传自定义udf的jar
   add jar /path/to/lower.jar
2. 创建临时函数
   create temporary function xxoo_lower as 'test.ql.LowerUDF';
3. 验证
   select xxoo_lower("Hello World!");



## 永久函数使用

1. 把自定义函数的jar上传到hdfs中.
   hdfs dfs -put lower.jar 'hdfs:///path/to/hive_func';
2. 创建永久函数
   create function TimeDiff as 'yang.udf.TimeDiff' using jar 'hdfs:///hive-function/hive-function-1.0-SNAPSHOT.jar';
3. 验证
   select TimeDiff('2019-09-09','2019-09-10','yyyy-MM-dd');
   show functions;
  • 10、sql执行顺序
from 
on 
join 
where 
group by 
having 
select 
distinct 
over
order by 
limit
  • 根据模型合成宽表
1、采用union all 的方式 ,然后在group by 把数据整合到同一行
 with 
 temp1 as (),
 temp2 as(),
 ···
 select from  temp1 union temp2 ···
 2、直接使用join 进行宽表的合成
 	这种合成的方式效率低下,建议使用第一种方式。
  • 12 、数据迁入迁是,使用sqoop
迁入:注意mysql中的 \t \r \n, 去除掉
迁出:
mysql中,中文输入法输入的数据,字段可能包含hive默认的分隔符\u0000-\u0013
迁入之后再导出会出现分隔符的问题,先过滤数据。
regexp_replace(m.changed_way,'([\\u0000-\\u0013]+)','')

-13 hive sql中使用正则表达式

set hive.support.quoted.identifiers=None; 
select a.pin, `(pin)?+.+` from Table

-14 优化排序

order by全局排序,一个reduce实现,不能并行故效率偏低
sort by部分有序,配合distribute by使用
cluster by col1 == distribute by col1 sort by col1,但不能指定排序规则
  • 15 join 优化
多表joinkey值统一则可以归为一个reduce;
先过滤后join;
小表在前读入内存,大表在后;

-16 十三位时间戳格式转化

from_unixtime(cast(substr(time_stamp,1,10) as bigint), 'yyyy-MM-dd')
  • 17 map数据类型与json互转
1select map(clientname,clientid) from dws.dws_awa_t_cal_recomperiods_result limit 10
 
返回:
 
{"陕西天诚软件有限公司":"51025"}
{"天俱时工程科技集团有限公司":"79261"}
{"杭州览众数据科技有限公司":"48848"}
{"上海融道文化传播有限公司":"157776"}
{"奈良(上海)商务咨询有限公司":"129871"}
{"深圳市自然醒智慧家居有限公司":"82233"}
{"成都艾乐橙文化传播有限公司":"110551"}
{"精诚瑞宝计算机系统有限公司":"23430"}
{"广西中科曙光云计算有限公司":"141473"}
{"临沂市拓普网络股份有限公司":"150854"}
 
例2select map(clientname,clientid,jobname,first_interview) from dws.dws_awa_t_cal_recomperiods_result limit 10
返回:
{"陕西天诚软件有限公司":"51025","AI开发工程师":null}
{"天俱时工程科技集团有限公司":"79261","销售":"2019-03-15 09:00:00.0"}
{"杭州览众数据科技有限公司":"48848","大客户软件销售经理":"2019-02-26 10:30:00.0"}
{"上海融道文化传播有限公司":"157776","自媒体运营":null}
{"奈良(上海)商务咨询有限公司":"129871","用户运营":null}
{"深圳市自然醒智慧家居有限公司":"82233","首席产品官":null}
{"成都艾乐橙文化传播有限公司":"110551","教学部HRD":"2019-01-08 15:00:00.0"}
{"精诚瑞宝计算机系统有限公司":"23430","信息安全产品经理(上海)":null}
{"广西中科曙光云计算有限公司":"141473","人力资源总监":"2019-04-29 10:00:00.0"}
{"临沂市拓普网络股份有限公司":"150854","人力总监":null}
 
例3select map("clientname",clientname,"clientid",clientid) from dws.dws_awa_t_cal_recomperiods_result limit 10
返回:
{"clientname":"陕西天诚软件有限公司","clientid":"51025"}
{"clientname":"天俱时工程科技集团有限公司","clientid":"79261"}
{"clientname":"杭州览众数据科技有限公司","clientid":"48848"}
{"clientname":"上海融道文化传播有限公司","clientid":"157776"}
{"clientname":"奈良(上海)商务咨询有限公司","clientid":"129871"}
{"clientname":"深圳市自然醒智慧家居有限公司","clientid":"82233"}
{"clientname":"成都艾乐橙文化传播有限公司","clientid":"110551"}
{"clientname":"精诚瑞宝计算机系统有限公司","clientid":"23430"}
{"clientname":"广西中科曙光云计算有限公司","clientid":"141473"}
{"clientname":"临沂市拓普网络股份有限公司","clientid":"150854"}
 
例4select collect_list(map("clientname",clientname,"clientid",clientid)) from dws.dws_awa_t_cal_recomperiods_result limit 2
 
返回:
[{
	"clientname": "陕西天诚软件有限公司",
	"clientid": "51025"
}, {
	"clientname": "天俱时工程科技集团有限公司",
	"clientid": "79261"
}, {
	"clientname": "杭州览众数据科技有限公司",
	"clientid": "48848"
}
...
]
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值