解决Hbase数据更新Phoenix对应索引表不更新问题

问题描述:

用户访问的数据接口直接走Phoenix,Phoenix的表是映射hbase产生,Phoenix的表会建很多索引,这时候问题就出现了,正常通过接口直接写数据进Phoenix表,相应的索引表也是会更新的,但是直接写数据到底层hbase表,这时候对应的索引表是不会更新,从而影响正常的用户访问

直接通过API把数据写入Phoeinx是正常的,如下图:


解决Hbase数据更新Phoenix对应索引表不更新问题

直接写数据到Hbase,索引是不会更新的,如下图:


解决Hbase数据更新Phoenix对应索引表不更新问题

解决:

如果数据是直接写进Hbase的,数据写进主数据表的时候,往索引表也写一份,这样,外部接口访问Phoenix的数据就正常了,如图:


解决Hbase数据更新Phoenix对应索引表不更新问题


这里说一下索引表的数据该怎么写:

这是我在phoenix里建的索引表,表字段如下



解决Hbase数据更新Phoenix对应索引表不更新问题


对应Hbase的表如下:


解决Hbase数据更新Phoenix对应索引表不更新问题


这时候会发现:

phoenix的索引表会把所有索引字段+ID拼接起来写进Hbase ,做为RowKey

格式:name\x00ID 

所以我们写数据进索引表就很简单了,我们插入主表数据的同时,把相应索引字段拼接起来插进索引表


举例:


1、        先插一条数据到住表nt_member这里测试,我只插两个字段,一个ID,一个name

解决Hbase数据更新Phoenix对应索引表不更新问题


2、        这时候去Phoenix查主表数据如下:

解决Hbase数据更新Phoenix对应索引表不更新问题


索引表数据如下:

解决Hbase数据更新Phoenix对应索引表不更新问题


结果:索引表没更新,主表也查不到这条数据


3、        往Hbase对应索引表插一条数据


解决Hbase数据更新Phoenix对应索引表不更新问题

(备注:注意,这里rowkey是双引号,如果是单引号会把‘\’转译掉,插入的数据就不对了)

4、        再次查询Phoenix表

先看索引表:

解决Hbase数据更新Phoenix对应索引表不更新问题

数据进来了

再看主表:


解决Hbase数据更新Phoenix对应索引表不更新问题

数据也能查到了


备注:其实数据在我们第一步做完之后,就已经进主表了,只是因为我们没有更新索引表,导致我们在Phoenix中的查询只要命中了那条没有更新的索引,查出来的数据就是有误的



最后:操作起来很简单,就是插rowkey中的\x00的时候要注意方式,下面是java调API往Hbase表里插\x00的一个例子:

http://blog.****.net/u012551524/article/details/79568675