创建外部表
首先启动gpfdist服务:
nohup gpfdist -d /home/dyt/PJ4 -p 9058 -l /home/dyt/PJ4/gpfdist.log &
查看是否启动成功:
ps -ef | grep gpfdist
创建外部表
1,123432423,2019-03-15 23:12:25,zsl
2,123657567,2019-03-15 23:12:26,sdf
3,123482825,2019-03-15 23:12:27,fgd
进入云数据库
psql -U dyt -h udw.lurymd.m0.service.ucloud.cn -p 5432 -d db_dyt -W
创建外部表
注意,这里端口号后,默认会转到之前确认的文件夹下,也就是/home/dyt/PJ4
drop external table test001_ext_1;
create external table public.test001_ext_1(
id integer,
phoneno varchar(20),
time date,
name varchar(128)
)
location(
'gpfdist://10.11.10.9:9058/test001_ext_1.txt'
)
Format 'TEXT' (delimiter as E',' null as '' escape 'OFF');
查看创建的表:
尝试在外部表中更新数据,并查看table:
发现table也同样变化了。
日志分析
日志分析是网站分析的基础,通过对网站浏览的日志进行分析,可以为网站优化提供数据支持,了解用户群以及用户浏览特性,对改进网站体验,提升流量有非常重要的意义。
创建外部表
我们已经有了一万行的网站数据data.txt
,首先还是创建外部表导入数据
drop external table test001_ext_2;
create external table public.test001_ext_2(
log_time timestamp(0), -- 浏览时间
cookie_id varchar(256), -- 浏览的id
url varchar(1024), -- 浏览的页面
ip varchar(64), -- 用户ip
refer_url varchar(1024) -- 域名
)
location(
'gpfdist://10.11.10.9:9058/data.txt'
)
Format 'TEXT' (delimiter as E',' null as '' escape 'OFF');
创建内部表
创建一个新的内部表,将外部表的数据进行导入:
drop table if exists log_path;
create table log_path(
log_time timestamp(0), -- 浏览时间
cookie_id varchar(256), -- 浏览的id
url varchar(1024), -- 浏览的页面
ip varchar(64), -- 用户ip
refer_url varchar(1024) -- 域名
)distributed by(cookie_id);
insert into log_path select * from test001_ext_2;
查看数据是否成功导入:
查询PV、UV分布
cookie_id可以视为唯一的用户标识,故UV可视为去重后的cookie_id数。SQL如下:
drop table if exists log_pv_uv_result;
create table log_pv_uv_result(
log_time varchar(1024),
pv integer,
uv integer
)distributed by(log_time);
insert into log_pv_uv_result
select to_char(log_time,'yyyy-mm-dd HH24:mi:00'),
COUNT(1) pv,
COUNT(distinct cookie_id) uv
from log_path
group by 1
order by 1;
查看数据:
导出数据
使用copy
命令导出
\copy log_pv_uv_result to '/home/dyt/PJ4/log_pv_uv.csv' csv;
这样我们就可以用csv对数据进行操作并简单画图
解析URL
- 解析URL,是指通过substring对URL进行正则表达式匹配,正则表达式
\w+://([\w.]+)
可以将域名匹配出来。 - 同样的,可以将参数后面关键字(
member_id
或memberId
)的值获取出来,作为字段member_id
。 -
split_part
函数可以将字符串按照某个字符串分割,然后获取其中一个子串。 -
regexp_split_to_array
函数可以将字符串按照某个字符串分割,然后转换为数组变量。
主要熟悉数据仓库分析函数的使用
drop table if exists log_path_tmp1;
create table log_path_tmp1 as
(select
log_time,
cookie_id,
substring(url,E'\\w+://([\w.]+)') AS host,
split_part(url,'?',1) AS url,
substring(url,E'member[_]?[i|I]d=(\\w+)') AS member_id,
regexp_split_to_array(split_part(url,'?',2),'&') AS paras,
ip,
refer_url
from log_path)
distributed by (cookie_id);
显示结果为:
用户浏览次数区间分析
select case when cnt>100 then '100+'
when cnt>50 then '51-100'
when cnt>10 then '11-50'
when cnt>5 then '6-10'
else '<=5' end tag,
count(1) as number
from (
select cookie_id,
count(1) cnt
from log_path_tmp1
group by 1
)t
group by 1;