现有hbase表上的Phoenix视图有效,但Phoenix表不起作用

时间:2018-11-15 19:48:23

标签: sql apache hbase phoenix

我是HBase和Phoenix的新手。我在映射现有的HBase表到phoenix时遇到问题。我的最终目的是,我应该能够使用Phoenix SQL更新HBase表的现有行以及向其中插入新行。 我在HBASE中的表如下所示(在列系列CASEDETAILS下有五个列):

CASES
COLUMN FAMILIES DESCRIPTION
{NAME => 'CASEDETAILS', BLOOMFILTER => 'NONE', VERSIONS => '2', IN_MEMORY => 
'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL 
=> 'FOREVER',COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 
'false', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}

当我使用命令

在此表上创建视图时
create view CASES( pk VARCHAR PRIMARY KEY,
                    CASEDETAILS.CASEID VARCHAR,
                    CASEDETAILS.CREATED VARCHAR,
                    CASEDETAILS.CREATEDBY VARCHAR,
                    CASEDETAILS.MBI VARCHAR,
                    CASEDETAILS.MEMBER VARCHAR);

它可以工作,我可以使用select查询从表中获取数据,但是我无法更新任何行,也无法插入新行。它给出一个错误“表是只读的”

但是在上述Phoenix创建命令中,我将“ view”替换为“ table”,即我试图在Phoenix中创建一个具有相同名称的表;表创建成功,但select语句不起作用。

所以我在这里有几个问题:

1)为什么现有Hbase表上的视图有效但表上没有?

2)是否可以使用Phoenix SQL接口更新HBase表中的现有行?

3)在Phoenix中映射现有表时,保持列名和列名大小写的顺序有多重要?

注意:我已经在现有数据库中浏览了类似的问题,并且发现我的视图在起作用,但在表中却没有。但是,没有一个问题能够解决我的最终问题,即通过Phoenix更新现有HBase表的现有行

1 个答案:

答案 0 :(得分:1)

以下是答案:

1。也可以使用更复杂的WHERE子句来定义视图,但是在这种情况下,您将无法获得DML,因为您将获得ReadOnlyException。仍然允许您查询它们,并且它们的WHERE子句将与标准SQL视图一样生效。
  如预期的那样,您也可以在另一个VIEW上创建一个VIEW,以进一步过滤数据集。适用与上述相同的规则:如果VIEW及其父VIEW中仅使用简单的相等表达式,则新视图也可以更新,否则为只读。

您可以在此处找到有关视图的更多详细信息:https://phoenix.apache.org/views.html

2。是的,您可以在phoenix表中更新/插入值,从而更新基础HBase表。

UPSERT INTO TEST(NAME,ID) VALUES('foo',123);

如果不存在,它将在表中插入记录,否则更新现有值。

3。无需维护Name列的顺序。列名称与名称映射。默认情况下,所有名称都使用大写字母,但是如果需要,可以在小写的引号中指定。 https://phoenix.apache.org/language/index.html#create_table