我对hbase和phoenix还不熟悉。我无法将现有的hbase表Map到phoenix。我在这里的最终目的是,我应该能够更新hbase表的现有行,并使用phoenix sql向其中插入新行。我在hbase中的表如下所示(在family 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 create命令中,我将“view”替换为“table”,也就是说,我试图在phoenix中创建一个同名的表;表创建成功,但select语句不起作用。
所以我这里有几个问题:
1) 为什么对现有hbase表的视图有效,而表无效?
2) 有没有办法使用phoenix sql接口更新hbase表中的现有行?
3) 在phoenix中Map现有表时,保持列名和列名大小写的顺序有多重要?
注意:我已经研究了现有的数据库中类似的问题,并意识到我的观点是可行的,但不是表。但是,没有一个问题能够解决我的最终问题,即通过phoenix更新现有hbase表的现有行
1条答案
按热度按时间wr98u20j1#
答案如下:
1.视图也可以用更复杂的where子句定义,但是在这种情况下,您不能对它们发出dml,因为您将得到readonlyexception。您仍然可以通过它们进行查询,它们的where子句将与标准sql视图一样有效。
正如预期的那样,您也可以在另一个视图上创建一个视图来进一步过滤数据集。上述规则同样适用:如果在视图及其父视图中仅使用简单的等式表达式,则新视图也是可更新的,否则是只读的。
您可以在此处找到有关视图的更多详细信息:https://phoenix.apache.org/views.html
2.是的,您可以更新/插入phoenix表中的值,该表也会更新基础hbase表。
如果不存在,它将在表中插入记录,否则更新现有值。
3.不需要维护列名的顺序。列名与名称Map。默认情况下,它将所有名称都用大写,但如果需要,可以用小写形式在引号内指定。https://phoenix.apache.org/language/index.html#create_table