hbase查询基于标准sql规范中间件Phoenix
Phoenix是个很好的hbase 查询工具,在hbase中安装也很简单,可以按照 http://www.cnblogs.com/laov/p/4137136.html 这个连接中进行配置客户端和服务端的Phoenix。
PhoenixSQL有如下类:
- 增删数据:ExecutableAddColumnStatement、ExecutableDropColumnStatement
- 创建/删除表格:ExecutableCreateTableStatement、ExecutableDropTableStatement
- Select操作:ExecutableSelectStatement
- 导入数据:ExecutableUpsertStatement
- 解释执行:ExecutableExplainStatement
Phoenix架构和特点:
Phoenix中SQL Query Plan的执行,基本上是通过构建一系列的Hbase scan来完成。为了尽可能减少数据传输,在Region Server使用Coprocessor来尽可能的执行Aggregate相关工作,基本思想是使用RegionObserver在PostScannerOpen hook中将RegionScanner替换成支持Aggregation工作的定制化的Scanner,具体的Aggregate操作通过custom的scan属性传递给RegionScanner。与基于MapReduce的框架执行Plan的思想比较,基本上就是通过Coprocessor,使用RegionServer自身来在各个节点上执行Aggregation。此外,通过各种定制的Filter在Hbase的RegionScanner scan过程中,尽早的将不相关的数据过滤掉。采用JDBC接口和应用程序交互。
目前支持简单的表的创建,修改,数据删减,过滤,检索等SQL语法,从语法上看,不支持多表操作,本质上应该是由于不支持多表联合类的操作如各种Join等,所以在Where部分也就不能做多表的比较。由于Coprocessor 和 Filter自身能力的限制,如果完全不依赖Map Reduce框架,只通过HbaseClient API想要实现复杂的Query操作如多表联合操作,相对比较困难,或者大量工作需要在客户端代码中实现,性能上可能无法满足需求。
执行查询时,在数据访问与运行时执行之间加上SQL这样一层抽象可以进行大量优化。比如说,对于GROUP BY查询来说,我们可以利用HBase中协同处理器这样的特性。借助于该特性,我们可以在HBase服务器上执行Phoenix代码。因此,聚合可以在服务端执行,而不必在客户端,这么做会极大减少客户端与服务端之间传输的数据量。此外,Phoenix还会在客户端并行执行GROUP BY,这是根据行键的范围来截断扫描而实现的。通过并行执行,结果会更快地返回。所有这些优化都无需用户参与,用户只需发出查询即可。
优点:
1:命令行和java客户端使用都很简单。尤其是java客户端直接面向JDBC接口编程,封装且优化了Hbase很多细节。
2:在单表操作上性能比Hive Handler好很多(但是handler也有可能会升级加入斜处理器相关聚合等特性)
3:支持多列的二级索引,列数不限。其中可变索引时列数越多写入速度越慢,不可变索引不影响写入速度(参考: https://github.com/forcedotcom/phoenix/wiki/Secondary-Indexing#mutable-indexing)。
4:对Top-N查询速度远超Hive(参考: https://github.com/forcedotcom/phoenix/wiki/Performance#top-n)
5:提供对rowkey分桶的特性,可以实现数据在各个region的均匀分布(参考: https://github.com/forcedotcom/phoenix/wiki/Performance#salting)
6:低侵入性,基本对原Hbase的使用没什么影响
7:提供的函数基本都能cover住绝大多数需求了
8:与Hive不同的是,Phoenix的sql语句更接近标准sql规范。
Phoenix的基本查询语法:
select * from shuju;
select count(1) from shuju;
select cmtid,count(1) as num from shuju group by cmtid order by num desc;
select avg(TO_NUMBER(avgt)) from shuju;
select cmtid,count(1) as num,avg(TO_NUMBER(avgt)) as avgt,avg(TO_NUMBER(loss)) as loss from shuju group by cmtid order by num desc;
select acm,dtype,cmtid,count(1) as num,avg(TO_NUMBER(avgt)) as avgt,avg(TO_NUMBER(loss)) as loss
from shuju
group by acm,dtype,cmtid
order by num desc;
select acm,dtype,porgcode,orgid,cmtid,count(1) as num,avg(TO_NUMBER(avgt)) as avgt,avg(TO_NUMBER(loss)) as loss
from shuju
group by acm,dtype,porgcode,orgid,cmtid
order by num desc;
where TO_DATE(ttime,'yyyyMMddHHmmss')=TO_DATE('20141125','yyyyMMdd')
select ttime from shuju order by ttime desc;
where TO_DATE(ttime,'yyyyMMddHHmmss')=TO_DATE('20141125','yyyyMMdd')
select TO_DATE(ttime,'yyyyMMddHHmmss') from shuju;
select TO_DATE('20141125','yyyyMMdd') from shuju;
select (TO_DATE(ttime,'yyyyMMddHHmmss')=TO_DATE('20141125','yyyyMMdd')) as aaa from shuju order by aaa asc;
java调用Phoenix的驱动例子:(Phoenix基本几乎标准sql规范)
import java.sql.*;
public class PhoenixJDBC {
public static void main(String args[]) {
try {
//Register JDBC Driver
Class.forName("org.apache.phoenix.jdbc.PhoenixDriver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:phoenix:54.152.31.122","","");
//Create a Statement class to execute the SQL statement
Statement stmt = conn.createStatement();
//Execute the SQL statement and get the results in a Resultset
ResultSet rs = stmt.executeQuery("select * from US_POPULATION");
// Iterate through the ResultSet, displaying two values
// for each row using the getString method
while (rs.next())
System.out.println("Name= " + rs.getString("host"));
}
catch (SQLException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
hbase查询基于标准sql规范中间件Phoenix的更多相关文章
- 多表联合查询 - 基于注解SQL
作者:汤圆 个人博客:javalover.cc 前言 背景:Spring Boot + MybatisPlus 用MybatisPlus就是为了不写SQL,用起来方便: 但是如果需要多表联合查询,还是 ...
- Phoenix——实现向HBase发送标准SQL语句
写在前面一: 本文总结基于HBase的SQL查询系统--Salesforce phoenix 写在前面二: 环境说明: 一.什么是Phoenix 摘自官网: Phoenix是一个提供hbase的sql ...
- CDH5..4.7+phoenix实现查询HBase异常:java.sql.SQLException: ERROR 1102 (XCL02): Cannot get all table regions
基础环境是用CM 安装的cdh5.4.7,phoenix使用的版本是phoenix-4.5.2-HBase-1.0-bin. 出现异常信息:java.sql.SQLException: ERROR 1 ...
- OPPO数据中台之基石:基于Flink SQL构建实数据仓库
小结: 1. OPPO数据中台之基石:基于Flink SQL构建实数据仓库 https://mp.weixin.qq.com/s/JsoMgIW6bKEFDGvq_KI6hg 作者 | 张俊编辑 | ...
- hbase查询,scan详解
一.shell 查询 hbase 查询相当简单,提供了get和scan两种方式,也不存在多表联合查询的问题.复杂查询需通过hive创建相应外部表,用sql语句自动生成mapreduce进行.但是这种简 ...
- 提高查询速度:SQL Server数据库优化方案
查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...
- 浅析基于微软SQL Server 2012 Parallel Data Warehouse的大数据解决方案
作者 王枫发布于2014年2月19日 综述 随着越来越多的组织的数据从GB.TB级迈向PB级,标志着整个社会的信息化水平正在迈入新的时代 – 大数据时代.对海量数据的处理.分析能力,日益成为组织在这个 ...
- 标准SQL语言的用法
原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94 ...
- 转:浅析基于微软SQL Server 2012 Parallel Data Warehouse的大数据解决方案
综述 随着越来越多的组织的数据从GB.TB级迈向PB级,标志着整个社会的信息化水平正在迈入新的时代 – 大数据时代.对海量数据的处理.分析能力,日益成为组织在这个时代决胜未来的关键因素,而基于大数据的 ...
随机推荐
- PAT L2-006【二叉树中序后序构造树】
#include<bits/stdc++.h> using namespace std; typedef long long LL; struct BT{ int w; BT *L; BT ...
- 读《JavaScript权威指南》笔记(二)
1.加号运算和比较运算符的区别 对于数字和字符串操作符来说,加号运算符和比较运算符的行为都有所不同,前者更偏爱字符串,如果它的其中一个操作数是字符串的话,则进行字符串连接操作.而比较运算符则更偏爱数字 ...
- bzoj 4974: [Lydsy八月月赛]字符串大师
4974: [Lydsy八月月赛]字符串大师 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 371 Solved: 190[Submit][Statu ...
- 洛谷P1373 小a和uim之大逃离
P1373 小a和uim之大逃离 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从 ...
- CF622F The Sum of the k-th Powers(拉格朗日插值)
题意 给出 \(n,k\) , \(n\le10^9,k\le10^6\) ,求 \(\sum_{i=1}^n i^k(mod\;10^9+7)\) 题解 自然数幂次和,是一个\(k+1\)次多项式, ...
- 再谈布局,栅栏式自适应布局的学习和实现(calc自适应布局)
布局真的很重要.一个不好的布局后期会有很多很多的bug,就像是建房子的地基一样. 首先,再一次地圣杯布局的学习,来源于该教程: http://www.jianshu.com/p/f9bcddb0e8b ...
- Qt学习之网络编程(二)
UDP协议 UDP协议(用户数据报协议)是一种简单轻量级.不可靠.面向数据报.无连接的传输层协议.之后我们会介绍TCP协议,相对于UDP,TCP是一种可靠的.有连接的协议:既然这样我们就用TCP不就好 ...
- Luogu P2290 [HNOI2004]树的计数 Prufer序列+组合数
最近碰了$prufer$ 序列和组合数..于是老师留了一道题:P2624 [HNOI2008]明明的烦恼 qwq要用高精... 于是我们有了弱化版:P2290 [HNOI2004]树的计数(考一样的可 ...
- oracle的存储过程优缺点
oracle的存储过程优缺点 1.存储过程可以使得程序执行效率更高.安全性更好,因为过程建立之后 已经编译并且储存到数据库,直接写sql就需要先分析再执行因此过程效率更高,直接写sql语句会带来安全性 ...
- hutool java工具架包功能介绍
https://blog.csdn.net/lx1309244704/article/details/76459718