|
一. 高阶函数
方法: 是一段逻辑代码的封装,实现功能,代码的重复使用,方便调用 方法是对象的一部分
函数:是一段逻辑代码的封装,实现功能,代码的重复使用,方便调用 函数比方法高级,可以作为一个特殊的对象单独存在
function f (int a , int b){
return a*b --a*b在方法中就是a*b , a+b在方法中就是a+b
}
public int opt(int a , int b , f){
return f(a,b)
}
}
arrayMap是一个高级函数 参数一是一个函数 参数二是一个数组
select arrayMap(x->x*x , [1,2,3,4]);
┌─arrayMap(lambda(tuple(x), multiply(x, x)), [1, 2, 3, 4])─┐
│ [1,4,9,16] │
└──────────────────────────────────────────────────────────┘
二. 字符串函数
1. splitByString() 字符串切割
select splitByString(',' , 'hello,tom'); --切割成一个数组
┌─splitByString(',', 'hello,tom')─┐
│ ['hello','tom'] │
└─────────────────────────────────┘
2. concat() 字符串拼接
select concat('hello' , 'tom'); --拼接成一个字符串
┌─concat('hello', 'tom')─┐
│ hellotom │
└────────────────────────┘
三. JSON
-- 在CH中建表
create table tb_json(cont String) engine=Log ;
insert into tb_json values('{"movie":"1207","rate":"4","timeStamp":"978300719","uid":"1"}')...
┌─cont──────────────────────────────────────────────────────────┐
│ {"movie":"1207","rate":"4","timeStamp":"978300719","uid":"1"} │
│ {"movie":"2028","rate":"5","timeStamp":"978301619","uid":"1"} │
│ {"movie":"531","rate":"4","timeStamp":"978302149","uid":"1"} │
│ {"movie":"3114","rate":"4","timeStamp":"978302174","uid":"1"} │
│ {"movie":"608","rate":"4","timeStamp":"978301398","uid":"1"} │
│ {"movie":"1246","rate":"4","timeStamp":"978302091","uid":"1"} │
│ {"movie":"1357","rate":"5","timeStamp":"978298709","uid":"2"} │
└───────────────────────────────────────────────────────────────┘
1. json函数
1) visitParamHas(params, name) --参数一:jsonrowdata 参数二:属性 是否有(1 , 0)
select visitParamHas(cont , 'movie') from tb_json;
┌─visitParamHas(cont, 'movie')─┐
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
└──────────────────────────────┘
2) visitParamExtractString(params, name) --访问数的一个属性
SELECT visitParamExtractString(cont, 'movie') FROM tb_json
┌─visitParamExtractString(cont, 'movie')─┐
│ 1207 │
│ 2028 │
│ 531 │
│ 3114 │
│ 608 │
│ 1246 │
│ 1357 │
└────────────────────────────────────────┘
3) JSONExtract(params , 'Tuple(属性和属性类型)') --通过属性解析数据内容 解析一个或多个
JSONExtract(params , 'Tuple(属性和属性类型)').n --指定解析的位数
select JSONExtract(cont , 'Tuple(movie String , rate String , timeStamp String , uid String)') from tb_json;
┌─JSONExtract(cont, 'Tuple(movie String)')─┐
│ ('1207') │
│ ('2028') │
│ ('531') │
│ ('3114') │
│ ('608') │
│ ('1246') │
│ ('1357') │
└──────────────────────────────────────────┘
┌─JSONExtract(cont, 'Tuple(movie String , rate String , timeStamp String , uid String)')─┐
│ ('1207','4','978300719','1') │
│ ('2028','5','978301619','1') │
│ ('531','4','978302149','1') │
│ ('3114','4','978302174','1') │
│ ('608','4','978301398','1') │
│ ('1246','4','978302091','1') │
│ ('1357','5','978298709','2') │
└────────────────────────────────────────────────────────────────────────────────────────┘
select JSONExtract(cont , 'Tuple(movie String , rate String , uid String)').1 from tb_json; --解析指定的位数
┌─tupleElement(JSONExtract(cont, 'Tuple(movie String , rate String , uid String)'), 1)─┐
│ 1207 │
│ 2028 │
│ 531 │
│ 3114 │
│ 608 │
│ 1246 │
│ 1357 │
└──────────────────────────────────────────────────────────────────────────────────────┘
四. Enum类型 --可以指定RED 也可以指定对应的数字
create table tb_color(
color Enum('RED'=1 , 'BLUE'=2 , 'GREEN'=3)
)engine=Log;
insert into tb_color values('RED'),(2),('GREEN');
┌─color─┐
│ RED │
│ BLUE │
│ GREEN │
└───────┘
五. 将日志数据导入到hive的ODS(原始数据层)中
1) 第一种方法: 日志数据可以通过MR程序对数据进行清洗 集成 转换 然后解析导入到hive的ODS中
2) 第二种方法; 也可以一直接导入到hive中对数据进行预处理,然后导入到hive的ODS中
六. 事件漏斗
--建表
CREATE TABLE
funnel_test(
uid String,
eventid String,
eventTime UInt64
) ENGINE = MergeTree PARTITION BY (uid, eventTime) ORDER BY (uid, eventTime);
--将linux中的数据导入到clickhouse指定库的表中
clickhouse-client -q "insert into db_doit.funnel_test FORMAT TSV" < event.data
┌─uid──┬─eventid─┬──eventTime─┐
│ uid1 │ event1 │ 1551398404 │
└──────┴─────────┴────────────┘
┌─uid──┬─eventid─┬──eventTime─┐
│ uid1 │ event2 │ 1551398406 │
└──────┴─────────┴────────────┘
┌─uid──┬─eventid─┬──eventTime─┐
│ uid1 │ event3 │ 1551398408 │
└──────┴─────────┴────────────┘
┌─uid──┬─eventid─┬──eventTime─┐
│ uid2 │ event2 │ 1551398412 │
└──────┴─────────┴────────────┘
┌─uid──┬─eventid─┬──eventTime─┐
│ uid2 │ event3 │ 1551398415 │
└──────┴─────────┴────────────┘
┌─uid──┬─eventid─┬──eventTime─┐
│ uid3 │ event3 │ 1551398410 │
└──────┴─────────┴────────────┘
┌─uid──┬─eventid─┬──eventTime─┐
│ uid3 │ event4 │ 1551398413 │
└──────┴─────────┴────────────┘
--windowFunnel(毫秒值) 相邻两个时间间隔小于4就都会执行,大于4后面都不会执行了
select
uid,
windowFunnel(4)(toDateTime(eventTime),eventid = 'event2',eventid = 'event3') as funnel --窗口的时间间隔是4毫秒
from
funnel_test
group by uid;
┌─uid──┬─funnel─┐
│ uid3 │ 0 │
│ uid1 │ 2 │
│ uid2 │ 2 │
└──────┴────────┘
|