写写日常在使用Hive SQL做分析时经常使用的一些函数或者方法
select uid from dw.today where tunittype like '%wew.%'
select uid from dw.today where tunittype rlike '.*(you|me).*'
点号(.):表示和任意字符串匹配,星号(*):表示重复“左边的字符串”,(x|y)表示和x或者y匹配
select uid from dw.today where not tunittype like '%wew.%'
工作中,需要查询某个区间的用户量,这个时候就需要对时间做处理,以便快速搞定
SELECT DISTINCT FROM_UNIXTIME(60*30*CAST(UNIX_TIMESTAMP("2017-11-11 13:23:23")/(60*30) AS BIGINT), 'yyyy-MM-dd HH:mm:ss')
FROM test_table
这里便将时间转化为13:00:00,记录的是13:00:00至13:30:00这段时间的数据量
SELECT DISTINCT FROM_UNIXTIME(60*10*CAST(UNIX_TIMESTAMP("2017-11-11 13:23:23")/(60*10) AS BIGINT), 'yyyy-MM-dd HH:mm:ss')
FROM test_table
总结:一个小时60分钟,一分钟60秒,按照时间单位的秒来转化为相应的区间
oder by
得到rank
语法形式:
row_number() over (partition by 字段 a order by 计算项 b desc ) rank
rank 排序的名称;partition by:类似 hive 的建表,分区的意思;order by :排序,默认是升序,加 desc 降序;这里按字段 a 分区,对计算项 b 进行降序排序
例子:
https://blog.csdn.net/jobschen/article/details/70821064
SELECT from_unixtime(unix_timestamp())
cast() 函数将字符串转换为整数、双精度浮点数或执行反向转换
可参考这个博客:https://blog.csdn.net/xiaoshunzi111/article/details/54343291/
select cast(a as double) from table
没错,在机器学习中给数据打标签过程最常用到的sql语句,主要用于处理单个列的查询结果
create table if not exists dw.huodong_uid_label as
select uid,
CASE
WHEN action=0 THEN 0
ELSE 1
END AS label from zhangxiang.huodong_action_0_2
select sum(A+B+C) as 总和 from table group by uid
这里要求A,B,C三列都是数值型
select uid,
sum(if(hour in (6,7,8,9,10), cast(num_rate_tgi as DOUBLE) ,0) )
from
table
where pt_dt = '2018-07-18' and group by uid
计算6点到11点前的累计tgi和
尝试分桶采样,显示不支持分区表。
方案一:
select * from data.next where pt_dt='2018-06-04' and label = 0 order by rand() limit 88000
网上查询说此方案效率低,其原因是每次要扫全表一次。
方案二:
select *, row_number() over(order by rand()) as rn from data.next where pt_dt='2018-06-04' and label = 0
有两个函数:
percentile(col,array(0.01,0.05,0.1))
percentile_approx(col,array(0.05,0.5,0.95),9999)
注意:这里要求 p∈(0,1) p ∈ ( 0 , 1 )
A REGEXP B
等同于RLIKE
select count(*) from olap_b_dw_hotelorder_f where create_date_wid not regexp '\\d{8}'
等同于
select count(*) from olap_b_dw_hotelorder_f where create_date_wid not rlike '\\d{8}'
语法结构:
regexp_extract(string subject, string pattern, int index)
例子:从[189][0]10001614-30以上-3中取出10001614-30来
select regexp_extract('[189][0]10001614-30以上-3','\\[0](.*?)(-)',1);
方案二
select regexp_extract('[189][0]10001614-30以上-3','\\[[0-9]+]\\[[0-9]+]([0-9]*)-',1);
方案三
select regexp_extract('[189][0]10001614-30以上-3','(\\[.*\\])([0-9]{0,})(.*)',2);
工作中,经常将sql和hive结合,然后对数据分析,有时也需要对分析的结果插入hive中,以便稳定的保存。
import hiveContext.implicits._
data.toDF().registerTempTable("table1")
hiveContext.sql("insert into table2 partition(date='2018-07-24') select name,col1,col2 from table1")
先将数据保存为文件,如csv格式。此方案对数据量太大的情况不合适,在将数据保持为csv等格式的时候容易导致服务崩溃。
hive -e "insert overwrite directory '/user/local/data_export.csv' row format delimited fields terminated by '\t' select * from locl.data limit 20;"
可以在xshell中的hive端执行,或者在shell中跑
hive -e "sql代码" >> log.txt
格式:在hive端执行sql文件
hive -f data.hql >> log.txt
#!/bin/bash
source /exportfs/home/test/.bash_profile
echo "
sql代码 ;
">data.hql
hive -f data.hql 2>log.txt
# 这里可以放定时的代码
https://blog.csdn.net/skywalker_only/article/details/27547515
返回周几等
https://blog.csdn.net/bitcarmanlee/article/details/51670879
http://hadooptutorial.info/hive-date-functions/
未完待续。。。。。。