2014-09-03 43 views
2

我试图用Apache Phoenix在HBase表上运行SQL查询。基于该official documetation,模式需要与SQL查询现有表中创建:Phoenix正在更改HBase表的元信息

CREATE TABLE TABLE_NAME (....) 

我试图通过凤API,但我直接连接到现有的表(与HBase的API创建的)来避免这个得到例外。 Phoenix正在执行这个查询时,它在桌面上创建了很多东西。例如,在HBase的仪表板的部分,我可以看到下面的元数据由凤凰添加到我的表:

'QUOTES', {METHOD => 'table_att', coprocessor$1 => '|org.apache.phoenix.coprocessor.ScanRegionObserver|1|', coprocessor$2 => '|org.apache.phoenix.coprocessor.UngroupedAggregateRegionObserver|1|', coprocessor$3 => '|org.apache.phoenix.coprocessor.GroupedAggregateRegionObserver|1|', coprocessor$4 => '|org.apache.phoenix.coprocessor.ServerCachingEndpointImpl|1|', coprocessor$5 => '|org.apache.phoenix.hbase.index.Indexer|1073741823|index.builder=org.apache.phoenix.index.PhoenixIndexBuilder,org.apache.hadoop.hbase.index.codec.class=org.apache.phoenix.index.PhoenixIndexCodec'}, {NAME => '0', DATA_BLOCK_ENCODING => 'FAST_DIFF', KEEP_DELETED_CELLS => 'true'} 

这听起来像凤凰正在改变表的元信息(它创建一些协处理器和索引构建器),这是否消除了生产问题(干扰使用HBase API的代码)?如果是的话如何避免它?

回答

3

是的,Apache Phoenix将协处理器添加到底层HBase表格的元数据中,当您按照here所记录的CREATE TABLECREATE VIEW。这些操作不会干扰使用HBase API的代码,因为只有在进行API调用的客户端设置了Phoenix特定的属性时才会触发协处理器执行的任何处理。

对于Phoenix VIEW,只做这些元数据更改。对于Phoenix TABLE,除了这些元数据更改之外,还会将一个空的KeyValue添加到表的每一行。这样做是为了提高性能,并防止如果所有列都设置为空,行将“消失”。更多详情here

+0

当你说它添加协处理器时,我做'CREATE TABLE'这是否意味着我可以使用phoenix而不调用此查询呢? – bachr 2014-09-07 09:31:03

+1

你的意思是你可以在没有先调用CREATE TABLE或CREATE VIEW的情况下在Phoenix中运行查询吗?如果是这样,不。但是,您可以[schema-on-read](http://phoenix.apache.org/dynamic_columns.html)查询未预先定义的列。 – 2014-09-16 00:18:56

+0

这是有点限制,因为我们不拥有hbase表,所以我们不能混淆它的结构。直接向查询直接添加colums看起来很有趣,但如果以前不需要定义模式,将会更加棒。 – bachr 2014-09-16 08:40:19