如何简单愉快的上手PipelineDB
pipelineDB source:https://github.com/pipelinedb/pipelinedb
安装PipelineDB
./configure CFLAGS="-g -O0" --enable-cassert --prefix=/usr/local/pipelinedb_0.9.7
除了原本postgres需要安装的几个依赖包外,还需要安装ZeroMQ
make
make install
套路跟Postgres一样一样的,安装完成后初始化DB,启动,登陆。PipelineDB默认带的不是postgres用户而是pipeline
[pipeline@bogon ~]$ /usr/local/pipelinedb_0.9.7/bin/psql
psql (9.5.3)
Type "help" for help.
pipeline=# \c
You are now connected to database "pipeline" as user "pipeline".
pipeline=#
创建Stream
在PipelineDB中,一个Stream就是一个FDW,其实不存储任何数据。
pipeline=# create stream my_stream(name text,age int,birth timestamp);
如果试图对stream进行查询是不被允许的:
pipeline=# select * from my_stream;
ERROR: "my_stream" is a stream
HINT: Streams can only be read by a continuous view's FROM clause.
被告知,只允许被continuous view 读取。
创建完成后,可以看见多出了一个字段"arrival_timestamp",这个就是流数据的到达时间,在sliding windows中需要用到这个时间。
pipeline=# \d my_stream
Stream "public.my_stream"
Column | Type
-------------------+-----------------------------
name | text
age | integer
birth | timestamp without time zone
arrival_timestamp | timestamp with time zone
创建Continuous Views
pipeline=# create continuous view cv as select name,age,birth from my_stream;
CREATE CONTINUOUS VIEW
pipeline=# \d cv
Continuous view "public.cv"
Column | Type | Modifiers
--------+-----------------------------+-----------
name | text |
age | integer |
birth | timestamp without time zone |
pipeline=#
创建cv后,会附带创建一些别的东西
pipeline=# \d
List of relations
Schema | Name | Type | Owner
--------+-----------+-----------------+----------
public | cv | continuous view | pipeline
public | cv_mrel | table | pipeline
public | cv_osrel | stream | pipeline
public | cv_seq | sequence | pipeline
public | my_stream | stream | pipeline
(5 rows)
- cv 这个跟数据库中普通的View很类似,不存储任何东西,可以把他理解成一个materialized view,并且是非常高吞吐量,realtime的物化视图。
- cv_mrel,这个就是存储具体数据的,跟pg中的物理表是一样一样的。上面的cv就是这个物理表的一个壳子,不过这个物理表存储的内容可能是HLL格式。
- cv_seq,这个是给物理表创建的一个PK,看看cv_mrel发现默认会有个$pk字段。
- cv_osrel 这个是internal relation representing an output stream 后面会讲到。
插入数据到流
pipeline=# insert into my_stream(name,age,birth) values('Li.Sang',28,'1989-03-01'::timestamp);
INSERT 0 1
pipeline=# select * from cv;
name | age | birth
---------+-----+---------------------
Li.Sang | 28 | 1989-03-01 00:00:00
(1 row)
我们看看表中的数据:
pipeline=# select * from cv_mrel;
name | age | birth | $pk
---------+-----+---------------------+-----
Li.Sang | 28 | 1989-03-01 00:00:00 | 1
(1 row)
pipeline=# insert into my_stream(name,age,birth) values('Zhang.San',30,now());
INSERT 0 1
pipeline=# select * from cv;
name | age | birth
-----------+-----+----------------------------
Li.Sang | 28 | 1989-03-01 00:00:00
Zhang.San | 30 | 2017-05-15 11:20:37.614901
(2 rows)
pipeline=# select * from cv_mrel;
name | age | birth | $pk
-----------+-----+----------------------------+-----
Li.Sang | 28 | 1989-03-01 00:00:00 | 1
Zhang.San | 30 | 2017-05-15 11:20:37.614901 | 2
(2 rows)
cv跟cv_mrel只是多了个$pk,这是在普通情况下,数据是这样的,如果做agg可能数据存储为HLL格式.
如果对HLL感兴趣可以看看https://stefanheule.com/papers/edbt13-hyperloglog.pdf
滑动窗口
我们来看看滑动窗口,在流计算中,窗口是个很重要的东西,例如最近5分钟,最近1小时,最近1天的汇总。
pipeline=# create continuous view cv_sliding_1_minute with(sw = '1 minute') as select time from my_sliding_stream ;
CREATE CONTINUOUS VIEW
pipeline=# \d cv_sliding_1_minute
Continuous view "public.cv_sliding_1_minute"
Column | Type | Modifiers
--------+-----------------------------+-----------
time | timestamp without time zone |
上面的SQL等价于:
create continuous view cv_sliding_1_minute as select time from my_sliding_stream where (arrival_timestamp > clock_timestamp() - interval '1 minute');
根据stream中的arrival_timestamp来判断数据的到达时间。
这个CV是获取最近一分钟的数据。
我们来测试一下:
pipeline=# insert into my_sliding_stream(time) values(now());
INSERT 0 1
pipeline=# select * from cv_sliding_1_minute;
time
----------------------------
2017-05-15 11:42:33.141251
(1 row)
pipeline=# insert into my_sliding_stream(time) values(now());
INSERT 0 1
pipeline=# select * from cv_sliding_1_minute;
time
----------------------------
2017-05-15 11:42:33.141251
2017-05-15 11:43:21.256779
(2 rows)
pipeline=# insert into my_sliding_stream(time) values(now());
INSERT 0 1
pipeline=# select * from cv_sliding_1_minute;
time
----------------------------
2017-05-15 11:43:21.256779
2017-05-15 11:43:59.362918
(2 rows)
pipeline=# select now();
now
-------------------------------
2017-05-15 11:44:04.015165+08
(1 row)
发现第一条数据 2017-05-15 11:42:33.141251已经没了。再过一会查询一下:
pipeline=# select * from cv_sliding_1_minute;
time
------
(0 rows)
pipeline=# select now();
now
------------------------------
2017-05-15 11:46:39.50591+08
(1 row)
这时cv已经什么都没了。
很好用的TTL功能(per-row time-to-live )
pipeline=# CREATE CONTINUOUS VIEW v_ttl WITH (ttl = '10 minute', ttl_column = 'minute') AS
pipeline-# SELECT minute(arrival_timestamp), COUNT(*) FROM my_sliding_stream GROUP BY minute;
CREATE CONTINUOUS VIEW
pipeline=# insert into my_sliding_stream values(now());
INSERT 0 1
pipeline=# insert into my_sliding_stream values(now());
INSERT 0 1
pipeline=# insert into my_sliding_stream values(now());
INSERT 0 1
pipeline=# select * from v_ttl;
minute | count
------------------------+-------
2017-05-15 13:48:00+08 | 3
(1 row)
pipeline=# select now();
now
------------------------------
2017-05-15 13:49:07.11884+08
(1 row)
pipeline=# insert into my_sliding_stream values(now());
INSERT 0 1
pipeline=# select * from v_ttl;
minute | count
------------------------+-------
2017-05-15 13:48:00+08 | 3
2017-05-15 13:49:00+08 | 1
(2 rows)
pipeline=# select now();
now
-------------------------------
2017-05-15 13:50:05.236968+08
(1 row)
pipeline=# insert into my_sliding_stream values(now());
INSERT 0 1
pipeline=# select * from v_ttl;
minute | count
------------------------+-------
2017-05-15 13:48:00+08 | 3
2017-05-15 13:49:00+08 | 1
2017-05-15 13:50:00+08 | 1
(3 rows)
pipeline=# insert into my_sliding_stream values(now());
INSERT 0 1
pipeline=# select * from v_ttl;
minute | count
------------------------+-------
2017-05-15 13:48:00+08 | 3
2017-05-15 13:49:00+08 | 1
2017-05-15 13:50:00+08 | 2
(3 rows)
pipeline=#
讲讲TRANSFORM
pipeline=# create stream str1(x bigint,y text,z timestamp);
CREATE STREAM
pipeline=# create stream str2(x bigint,y text,z timestamp);
CREATE STREAM
创建对应的CV
pipeline=# create continuous view cv_1 as select x,y,z from str1;
CREATE CONTINUOUS VIEW
pipeline=# create continuous view cv_2 as select x,y,z from str2;
CREATE CONTINUOUS VIEW
创建TRANSFORM
pipeline=# create continuous transform tran_1 as select x,y,z from str1 then execute procedure pipeline_stream_insert('str2');
CREATE CONTINUOUS TRANSFORM
pipeline=# insert into str1(x,y,z) values(1,'Hi,I from str1 msg',now());
INSERT 0 1
pipeline=# select * from cv_1;
x | y | z
---+--------------------+----------------------------
1 | Hi,I from str1 msg | 2017-05-15 13:56:22.760362
(1 row)
pipeline=# select * from cv_2;
x | y | z
---+--------------------+----------------------------
1 | Hi,I from str1 msg | 2017-05-15 13:56:22.760362
(1 row)
pipeline=#
在创建Transform用到的pipeline_stream_insert是PipelineDB自己提供的一个函数,这个我们可以自己定义一个函数。
pipeline=# create table t(x bigint,y text,z timestamp);
CREATE TABLE
pipeline=# CREATE OR REPLACE FUNCTION insert_into_t()
pipeline-# RETURNS trigger AS
pipeline-# $$
pipeline$# BEGIN
pipeline$# INSERT INTO t (x, y,z) VALUES (NEW.x, NEW.y,NEW.z);
pipeline$# RETURN NEW;
pipeline$# END;
pipeline$# $$
pipeline-# LANGUAGE plpgsql;
CREATE FUNCTION
pipeline=# CREATE CONTINUOUS TRANSFORM tran_t AS
pipeline-# SELECT x,y,z FROM str1
pipeline-# THEN EXECUTE PROCEDURE insert_into_t();
CREATE CONTINUOUS TRANSFORM
pipeline=# insert into str1(x,y,z) values(10,'I want insert table t',now());
INSERT 0 1
pipeline=# select * from t;
x | y | z
----+-----------------------+---------------------------
10 | I want insert table t | 2017-05-15 14:01:48.17516
(1 row)
自己写了一个trigger,然后把数据插入到表T中。
如何简单愉快的上手PipelineDB的更多相关文章
- Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”
整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...
- 一个简单且易上手的 Spring boot 后台管理框架-->EL-ADMIN
一个简单且易上手的 Spring boot 后台管理框架 后台源码 前台源码
- echarts简单用法快速上手
1.html结构 简单说就是一个标签一个图表:2.初始化:var myEcharts = echarts.init(document.getElementById("xxx")): ...
- Sass简单、快速上手_Sass快速入门学习笔记总结
Sass是世界上最成熟.稳定和强大的专业级css扩展语言 ,除了Sass是css的一种预处理器语言,类似的语言还有Less,Stylus等. 这篇文章关于Sass快速入门学习笔记. 资源网站大全 ht ...
- DataWorks2.0——DataStudio简单对比使用上手
1.原先的数据管理去哪里了? 悬停在此图标上即可: 2.项目模式有何不同?
- 简单layer 快速上手
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 搭建一个简单的mybatis框架
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
- 国内最全最详细的hadoop2.2.0集群的MapReduce的最简单配置
简介 hadoop2的中的MapReduce不再是hadoop1中的结构已经没有了JobTracker,而是分解成ResourceManager和ApplicationMaster.这次大变革被称为M ...
- 简单的XPath入门
XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.XPath 是 XML 的查询语 ...
随机推荐
- Java中Double保留后小数位的几种方法
最近做个小实验,其中一部分要求将表单提交的数据转换为double,这个功能其实很简单直接一句Double.parseDouble(request.getParameter("chinese& ...
- DNS主从服务部署
(1)节点信息 console01 主DNS 192.168.80.3 192.168.10.3 console02 从DNS 192.168.80.4 192.168.10.4 (2)环境部署 # ...
- 关于easyui的datagrid属性出现乱码问题
今天遇到这个问题也是纠结了好久,经过在网上各种查询总结,得出以下经验: 1:网页字符集设置为UTF-8: <meta content="charset=UTF-8 " /&g ...
- 原生addClass 方法 添加类函数
function addClass(id,new_class){ var i,n=0; new_class=new_class.split(","); ...
- react-native多图选择、图片裁剪(支持ad/ios图片个数控制)
扯淡: 目前关于rn比较知名并且封装好的图片选择控件很多,不过能同时支持多图片上传,个数控制兼容iOS/Ad的却寥寥无几,而今天介绍的这款框架可以实现:图片裁剪.最大图片个数限制.拍照.本地相册等功能 ...
- 68、django之session与分页
前面我们介绍了cookies,主要应用在用户登录上,保存用户登录状态,不过cookies直接放在了浏览器上,安全性较低,所以我们便引出了session功能与cookies相同,不同的是它放在了客户端, ...
- c# asp.net 多数组索引的解决方法
本人今天做了一个功能 需要在一个类里用多个数组, 数组需要索引器来调用 一个数组 我查了msdn 一个类里面只能有一个this 索引器 那这么多数组如何构造索引呢 我在坛子里找到了解决之道 view ...
- GitLab搭建详细过程
一.前提 系统:Centos 6.5 软件版本:gitlab-7.8.4 Selinux:关闭 防火墙规则:先清空(搭建好了后续自己添加相关放行规则) 二.yum源配置和相关依赖包 1.添加epel源 ...
- TensorFlow(三)---------正则化
TensorFlow正则化经常被用于Deep-Learn中,泛化数据模型,解决过拟合问题.再深度学习网络只有在有足够大的数据集时才能产生惊人的学习效果.当数据量不够时,过拟合的问题就会经常发生.然而, ...
- 智能合约开发环境搭建及Hello World合约
如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约 ...