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)

  1. cv  这个跟数据库中普通的View很类似,不存储任何东西,可以把他理解成一个materialized view,并且是非常高吞吐量,realtime的物化视图。
  2. cv_mrel,这个就是存储具体数据的,跟pg中的物理表是一样一样的。上面的cv就是这个物理表的一个壳子,不过这个物理表存储的内容可能是HLL格式。
  3. cv_seq,这个是给物理表创建的一个PK,看看cv_mrel发现默认会有个$pk字段。
  1. 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的更多相关文章

  1. Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”

    整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...

  2. 一个简单且易上手的 Spring boot 后台管理框架-->EL-ADMIN

    一个简单且易上手的 Spring boot 后台管理框架 后台源码 前台源码

  3. echarts简单用法快速上手

    1.html结构 简单说就是一个标签一个图表:2.初始化:var myEcharts = echarts.init(document.getElementById("xxx")): ...

  4. Sass简单、快速上手_Sass快速入门学习笔记总结

    Sass是世界上最成熟.稳定和强大的专业级css扩展语言 ,除了Sass是css的一种预处理器语言,类似的语言还有Less,Stylus等. 这篇文章关于Sass快速入门学习笔记. 资源网站大全 ht ...

  5. DataWorks2.0——DataStudio简单对比使用上手

    1.原先的数据管理去哪里了? 悬停在此图标上即可:  2.项目模式有何不同?

  6. 简单layer 快速上手

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 搭建一个简单的mybatis框架

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  8. 国内最全最详细的hadoop2.2.0集群的MapReduce的最简单配置

    简介 hadoop2的中的MapReduce不再是hadoop1中的结构已经没有了JobTracker,而是分解成ResourceManager和ApplicationMaster.这次大变革被称为M ...

  9. 简单的XPath入门

    XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.XPath 是 XML 的查询语 ...

随机推荐

  1. [Bayesian] “我是bayesian我怕谁”系列 - Latent Variables

    下一章有意讲讲EM和变分推断的内容. EM和变分推断的内容能Google到很多,虽然质量乘次不齐,但本文也无意再赘述那么些个细节. 此处记录一些核心思想,帮助菜鸡形成整体上的认识.不过,变分推断也不是 ...

  2. C# Request.InputStream 读取输入流为空的原因处理

    今天在手机App测试接口的时候发现一个通过POST方式的接口 获取body中的参数一直为空,但是在数据量小的时候却可以获取到数据,开始怀疑是不是POST的长度有限制,然后在web.config中修改了 ...

  3. Java基础——数据类型

    Java中与C++的区别: 1.Java中没有无符号类型. 2.整型值和布尔值之间不能进行相互转换. 3.Java中不区分变量的定义和声明. 如:在C++中int i = 10;是一个定义,而exte ...

  4. (转)linux下如何批量杀JAVA进程或某个进程方法

    在工作中经常需要停止JAVA进程,停止时间也比较长,那么有时候因为一些情况,需要把 linux 下JAVA所有进程 kill 掉,又不能用killall 直接杀掉某一进程名称包含的所有运行中进程(我们 ...

  5. 软硬链接、文件删除原理、linux中的三种时间、chkconfig优化

    第1章 软硬链接 1.1 硬链接 1.1.1 含义 多个文件拥有相同的inode号码 硬链接即文件的多个入口 1.1.2 作用 防止你误删除文件 1.1.3 如何创建硬链接 ln 命令,前面是源文件  ...

  6. mongodb集群【】

    参考 http://www.jianshu.com/p/2825a66d6aed http://www.cnblogs.com/huangxincheng/archive/2012/03/07/238 ...

  7. [Bayesian] “我是bayesian我怕谁”系列 - Variational Autoencoders

    本是neural network的内容,但偏偏有个variational打头,那就聊聊.涉及的内容可能比较杂,但终归会 end with VAE. 各个概念的详细解释请点击推荐的链接,本文只是重在理清 ...

  8. java注解(Annotation)

    本文转载自http://www.cnblogs.com/xdp-gacl/p/3622275.html 一.认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解 ...

  9. Java多线程Master-Worker模式

    Java多线程Master-Worker模式,多适用于需要大量重复工作的场景中. 例如:使用Master-Worker计算0到100所有数字的立方的和 1.Master接收到100个任务,每个任务需要 ...

  10. 向ASP.NET Core迁移

    有人说.NET在国内的氛围越来越不行了,看博客园文章的浏览量也起不来.是不是要转Java呢? 没有必要扯起语言的纷争,Java也好C#都只是语言是工具,各有各的使用场景.以前是C#非开源以及不能在Li ...