第一:
建表问题:
(1):如果在phoenix中建表,那么表建好以后,它会自动映射到hbase库里面,即hbase库里面就有这个表了,如果像phoenix中的表插入数据,那么数据会自动在hbase库中映射表中插入数据。
(2):如果是先在hbase中建表,那么phoenix中是不存在这个相同的表的,因此要在phoenix中映射有hbase中这个相同的表,那么就必须在phoenix中创建相同的表,并且数据的类型要跟hbase中的数据类型要一样,这样hbase中的表以及表中的数据就可以映射到phoenix中。
例子:phoenix中的建表语句:
create table “mhl_session_max_time_da”(
“advert_id” varchar(20) not null primary key,
“mhl”.“create_time” varchar DEFAULT NULL,
“mhl”.“store” varchar(255) DEFAULT NULL,
“mhl”.“region” varchar(255) DEFAULT NULL,
“mhl”.“agent_name” varchar(80) DEFAULT NULL,
“mhl”.“max_session_time” varchar(20) DEFAULT NULL
) COLUMN_ENCODED_BYTES=‘NONE’;
注:phoenix中的建表语句中,不能用comment 来对字段进行解释,否则会报错
数据类型
(1):Hbase中的数据类型都是Byte类型,显示都是二进制的形式,如果想在hbase中能看到数据,那么可以在导入数据到hbase中时可以弄成String类型,这样在hbase中就可以看见数据。
(2):如果已经数据本来的数据类型来存到habse上,比喻int,double,存在habse那么数据会显示成二进制形式,如果是存入“”中文“”,那么hbase中的中文都显示成二进制形式,把表映射到phoenix上,phoenix上的数据类型要跟hbase上的数据类型相同,那么在phoenix上去写sql语句查找数据,数据都是可以显示出来的,中文也可以显示出来的。
第二:
Phoenxi的脚本命令来创建表
注意:phoenix建表的时候表名、列族、列名是有大小写区分的,要想用小写,那么必须用双引号括起来,不然就会显示的是大写。
建表脚本:
./psql.py data-1,data-2,data-3:2181 /data2/shuairui/mhl_session_max_time_da.sql
mhl_session_max_time_da.sql的内容如下:
CREATE TABLE IF NOT EXISTS WEB_STAT (
HOST CHAR(2) NOT NULL,
DOMAIN VARCHAR NOT NULL,
FEATURE VARCHAR NOT NULL,
DATE DATE NOT NULL,
USAGE.CORE BIGINT,
USAGE.DB BIGINT,
STATS.ACTIVE_VISITOR INTEGER
CONSTRAINT PK PRIMARY KEY (HOST, DOMAIN, FEATURE, DATE)
);
导入数据:
./psql.py -t WEB_STAT data-1,data-2,data-3:2181 /data2/mhl_session_max_time_da.csv
一定要用逗号分割的csv
参考文档:http://blog.youkuaiyun.com/fansy1990/article/details/22939887
第三:
Hbase中已经存在表,与Phoenix做映射
hbase 已有表LCT_TEST:
只需在phoenix中添加同名表即可映射到hbase的同名表.
create table “LCT_TEST”(“ROW” varchar primary key, “op_www”.“exists” varchar , “op_www”.“exists1” varchar);
把HBASE中的ROW当作主键
表名和列族以及列名需要用双引号括起来,因为HBase是区分大小写的,如果不用双引号括起来的话Phoenix在创建表的时候会自动将小写转换为大写字母.
参考文档:http://blog.youkuaiyun.com/maomaosi2009/article/details/45598985
第四:
Phoenix中踩过的坑:
1、phoenix插入数据,如果存在单引号情况,记住转义处理。
2、Phoneix是apache下top level的针对HBase的sql引擎,可以方便地使用此以sql形式访问HBase。我们用它来读取HBase的数据性能方面的可以参考官网:http://phoenix.apache.org/performance.html#
3、limit支持的问题: 不支持limit N,M 这种类似于Mysql的写法,支持limit N
目前DWAPI中配置的返回条数中如果不手动写limit N,它会按照下拉框:返回结果限制数 生成LIMIT N,M语法,导致sql执行失败
异常信息举例:
2317:java.sql.SQLException: ERROR 602 (42P00): Syntax error. Missing “EOF” at line 3, column 74. Query:
2318:
2319:select * from “em_user_deal” where “pk”=‘1000755_亲子频道_2014-11-14’ limit 0,5000