clickhouse----高阶函数 JSON解析 日志数据导入hive 事件漏斗

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 06:29   45   0

一. 高阶函数

方法: 是一段逻辑代码的封装,实现功能,代码的重复使用,方便调用 方法是对象的一部分

函数:是一段逻辑代码的封装,实现功能,代码的重复使用,方便调用 函数比方法高级,可以作为一个特殊的对象单独存在

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 │
└──────┴────────┘

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP