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();
 }
 }
 }

 

时间: 2024-10-31 16:59:23

hbase查询基于标准sql规范中间件Phoenix的相关文章

Phoenix——实现向HBase发送标准SQL语句

写在前面一: 本文总结基于HBase的SQL查询系统--Salesforce phoenix 写在前面二: 环境说明: 一.什么是Phoenix 摘自官网: Phoenix是一个提供hbase的sql操作的框架,Phoenix是构建在HBase之上的一个SQL中间层.Phoenix完全使用Java编写,代码位于GitHub上,并且提供了一个客户端可嵌入的JDBC驱动.对于简单的低延迟查询,其性能量级为毫秒:对于百万级别的行数来说,其性能量级为秒.Phoenix并不是像HBase那样 用于map-

一道SQL笔试题:使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位

S (SNO,SNAME,SDD,SAGE) SNO,SNAME,SDD,SAGE 分别代表学号.学 员姓名.所属单位.学员年龄 C (CNO,CNAME ) CNO,CNAME 分别代表课程编号.课程名称 SC(SNO,CNO,SCORE ) SNO,CNO,SCORE 分别代表学号. 所选修的 课程编号.学习成绩 三个表的数据如下: 问题: 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位 自己写的SQL: SELECT SNO,SDD FROM S WHERE SNO IN( s

标准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%A8%E6%96%B9%E6%B3%95%E5%8F%8A%E5%A4%9A%E8%A1%A8%E8%BF%9E%E6%8E%A5/ 标准SQL语言的用法 SQL语言是目前最通用的关系数据库语言.ANSI SQL是指由美国国家标准局(ANSI)的数据库委员会制定的标准SQL语言,多数关系数据库产品

JDBC数据类型、Java数据类型、标准sql类型

本文转自:http://www.cnblogs.com/shishm/archive/2012/01/30/2332142.html 谢谢原作者细心的总结,很赞! 本概述是从<JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference>这本书中摘引来的.JavaSoft 目前正在准备这本书.这本书是一本教程,同时也是 JDBC 的重要参考手册,它将作为 Java 系列的组成部份,在 1997 年春季由 Addis

SQL规范

注:本文转载自 MR_ke 的博客 地址:http://justcoding.iteye.com/blog/2007243 我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员 流动大,那么我们还能保证下一段时间系统还能流畅的运行吗?我们还能保证下一个人能看懂我们的存储过程吗?那么我结合公司平时的培训和平时个人工作经验和 大家分享一下,希望对大家有帮助. 要知道sql语句,我想我们有必要知道sqlserver查

hbase查询,scan详解

一.shell 查询 hbase 查询相当简单,提供了get和scan两种方式,也不存在多表联合查询的问题.复杂查询需通过hive创建相应外部表,用sql语句自动生成mapreduce进行.但是这种简单,有时为了达到目的,也不是那么顺手.至少和sql查询方式相差较大. hbase 提供了很多过滤器,可对行键,列,值进行过滤.过滤方式可以是子串,二进制,前缀,正则比较等.条件可以是AND,OR等 组合.所以通过过滤,还是能满足需求,找到正确的结果的. 1.1 过滤器类型 HBase 最新官方文档中

标准sql语句,学习

标准SQL语句总结标准SQL语句总结,标准SQL语言基本上适用于下面所列出的数据库软件 ----------------------------------------------------------------------------- 数据库软件清单 A商业数据库软件如下 1.微软的MS SQL Server和Access 2.IBM的DB2,informax 3.Sybase的大型数据库ASE,中小型数据库ASA 4.甲骨文公司的Oracle8.0,oracle9i系列 5.Borla

Java,Hibernate,标准sql数据类型之间的对应表

(2010-07-14 19:53:50) 转载▼ 标签: 杂谈 分类: JAVA Hibernate API简介 其接口分为以下几类: l         提供访问数据库的操作的接口: l         用于配置Hibernate的接口: l         回调接口 l         扩展Hibernate的功能的接口. 这些接口大多数位于net.sf.hibernate包中 Hibernate的核心接口 5个核心接口: l         Configuration接口:配置Hiber

参数化查询为什么能够防止SQL注入

很多人都知道SQL注入,也知道SQL参数化查询可以防止SQL注入,可为什么能防止注入却并不是很多人都知道的. 本文主要讲述的是这个问题,也许你在部分文章中看到过这块内容,当然了看看也无妨. 首先:我们要了解SQL收到一个指令后所做的事情: 具体细节可以查看文章:Sql Server 编译.重编译与执行计划重用原理 在这里,我简单的表示为: 收到指令 -> 编译SQL生成执行计划 ->选择执行计划 ->执行执行计划. 具体可能有点不一样,但大致的步骤如上所示. 接着我们来分析为什么拼接SQ