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. JAVA 的 Date、Calendar的常用用法

    一.Date与String的互转用法,这里需要用到SimpleDateFormat Date date = new Date();        //设置格式        SimpleDateFor ...

  2. Coursera上视频无法播放将怎么解决?

    相信很多朋友在播放Coursera中的视频都会遇到一个问题,视频全黑,点击播放,进度条转了一圈又消失不见. 这时候我们该找找是什么问题啦? 解决方法一: 如果你是FQ看的网课视频,那么你把VPN从au ...

  3. 链表倒数第n个节点

    找到单链表倒数第n个节点,保证链表中节点的最少数量为n. 样例 给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1. /** * Definiti ...

  4. Just a Hook(区间set)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. Python pip 下载速度慢? Windows 设置 国内源,用 阿里云 国内镜像 加速

    pip 提供了对 Python 包的查找.下载.安装.卸载的功能,是非常方便的 Python 包管理工具.但是,令人苦恼的是 pip 在国内的下载速度非常慢,速度常常只有每秒几十 K,甚至才几 K,小 ...

  6. JSOUP教程,JSOUP 乱码处理,JSOUP生僻字乱码解决方案

    JSOUP乱码情况产生 这几天我用 JSOUP 多线程的方式,爬取了200 多万数据,数据为各地的地名相关.结果有小部分数据,不到 1 万乱码.我先检查了我的编码为UTF-8 ,觉得应该没有问题.代码 ...

  7. 使用原生JavaScript的Canvas实现拖拽式图形绘制,支持画笔、线条、箭头、三角形、矩形、平行四边形、梯形以及多边形和圆形,不依赖任何库和插件,有演示demo

    前言 需要用到图形绘制,没有找到完整的图形绘制实现,所以自己实现了一个 - - 一.实现的功能 1.基于oop思想构建,支持坐标点.线条(由坐标点组成,包含方向).多边形(由多个坐标点组成).圆形(包 ...

  8. 淘宝联盟api调用笔记

    一.流程及主要请求接口 每日凌晨1点开始,服务器定时自动请求淘宝联盟数据,请求完毕之后,执行一个存储过程对数据进行整理,删除过期...购买数量<...的商品......,请求接口分别有(tbk_ ...

  9. Ubuntu & Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践

    相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...

  10. .net core 在视图中快速获取路由(Areas、Controller、Action)

    我们在.net core中,经常碰到需要获取当前的Areas.Controller.Action,于是小编就扩展了Html,这样即可使用 Html.***来获取这些信息. 具体扩展类如下: publi ...