我是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表的现有行
答案 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