一.与hbase 的映射
1.空表格映射
在phoenix中创建表格,会自动映射到hbase中,我们可以通过hbase shell 来查看。举个例子,我们创建了一个表,
create table hbase_col_test(
pk varchar not null primary key,
//primary key 映射到hbase 中的rowkey
"cf1"."col1" varchar ,
//对应hbase的列族cf1,列名为col1
"cf1"."col2" varchar ,
//对应cf1:col2
"cf2"."col3" varchar
//对应cf2:col3
);
创建的时候注意格式的书写。
2.对于已经存在的hbase表做映射
通过创建视图来查询hbase表,我们举个例子,对于一个列族的查询:
create view "test" (
k varchar not null primary key, //主键对应hbase 中的rowkey
"val" varchar)default_column_family='cf1';//列名与hbase 中对应即可
对于多个列族的查询,可以这样写:
create view "hbase_to_phoe"(
pk varchar not null primary key, -----主键对应
"addr"."province" varchar, -----addr列族,province列(hbase中定义的列)
"school"."name" varchar); -----school列族,name列(hbase中定义列)
二 .导入数据的方式
这里我只介绍中小数据级导入,我们先进入{Phoenix_dir}/bin路径下,然后通过./psql.py 导入数据:
./psql.py -t HBASE_COL_TEST -d $'\t' $zk_addr:2181 ../data/hbase_col_data.csv (HBASE_COL_TEST是表名,'\t'是数据分割符,导入数据时表明必须是大写,不然可能无法导入)
三 . java API 操作hbase
准备工作:
- 从集群中拷贝以下文件:core-site.xml,hbase-site.xml,hdfs-site.xml放在工程src下。
- 把phoenix的phoenix-{version}-client.jar 和phoenix-core-{version}.jar添加到classpath中
- 配置寄存中各个节点的hosts文件,把客户端的hostname:IP添加进去(不添加好像也没有影响)
- 在客户端host文件中加入集群的hostname 和IP
工程截图如下所示:
具体Phoenix_Test.java代码如下:
package com.lanyizheng.phoenix;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Phoenix_Test {
public static void main(String[] args) throws SQLException {
//我这里是访问远程服务器上的hbase服务,所以在程序中设置hbase.tmp.dir 的路径
System.setProperty("hbase.tmp.dir", "/tmp");
try{
//驱动加载 Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
}catch(Exception e){
e.printStackTrace();
}
//配置zookeepr地址,后面的就是常见的jdbc操作
String url="jdbc:phoenix:bj-g2hdp1,bj-g2hdp2,bj-g2hdp3:2181";
Connection conn=DriverManager.getConnection(url);
Statement statement=conn.createStatement();
String sql="select count(1) as num from web_stat";
long time=System.currentTimeMillis();
ResultSet rs=statement.executeQuery(sql);
while(rs.next()){
int count=rs.getInt("num");
System.out.println("row count is"+count);
}
long timeUsed=System.currentTimeMillis()-time;
System.out.println("time"+timeUsed+"mm");
rs.close();
statement.close();
conn.close();
}
}