我有一个HBase安装,其中包含一堆现有表,其中包含大量数据(我不希望将其删除)。我最近发现使用Apache Phoenix能够使用类似SQL的语法查询HBase数据,到目前为止它非常棒。但是,由于我还不完全熟悉各种数据类型以及它们如何映射到我在HBase中存储的Java类型,有时候我弄错了。如果我有一个HBase列,我存储为
Bytes.toBytes(Long long)
我不小心将我的Phoenix列创建为varchar,我现在如何在不丢失所有数据的情况下更改Phoenix列?如果我做
alter table "mytable" add "myfamily"."mycolumn" unsigned_long
然后
alter table "mytable" drop column "mycolumn"
然后
alter table "mytable" add "myfamily"."mycolumn" varchar
我的所有HBase数据都从底层的“mycolumn”列中删除了!解决这个问题的最佳方法是什么?
我读到了关于设置参数
的内容phoenix.schema.dropMetaData
为假,听起来就像我想要的那样,但我无法弄清楚我实际设置的位置。当登录到Phoenix时,我可以在Squirrel中发出一些命令将其设置为false吗?或者它是一个环境变量?
提前感谢您的帮助!
编辑1
我在Phoenix中创建了一个虚拟表,其中包含每种类型的列,然后在system.catalog表中查找它以获取表示每种数据类型的数字。然后我使用了以下命令
upsert into system.catalog (table_name, column_name, column_family, data_type) values ('mytable','mycolumn','mycf',3)
将mycolumn的类型更改为小数。但是,当我查询mytable时,mycolumn仍然是unsigned_long类型。也许更新这个值后我需要重启HBase?
供参考:
COLUMN_NAME DATA_TYPE
MYTINYINT -6
MYBIGINT -5
MYDECIMAL 3
MYINTEGER 4
MYFLOAT 6
MYDOUBLE 8
MYUINTEGER 9
MYULONG 10
MYUTINYINT 11
MYVARCHAR 12
ROWID 12
MYUFLOAT 14
MYUDOUBLE 15
MYBOOLEAN 16
MYUTIME 18
MYUDATE 19
MYUTIMESTAMP 19
MYDATE 91
MYTIME 92
MYTIMESTAMP 93
编辑2
似乎可以通过删除SYSTEM.CATALOG和SYSTEM.STATS中表的所有条目来摆脱Phoenix的表而不触及底层的HBase表。然后可以使用所需的列类型重新创建该表。不知道这可能会对我的HBase表产生任何可怕的负面影响!
答案 0 :(得分:1)
Phoenix将所有表的元数据存储在名为SYSTEM_CATALOG的另一个HBase表中。参数
phoenix.schema.dropMetaData
强制在给出ALTER命令时从目录表中删除元数据。
如果将其设置为false,则下次创建具有相同名称的表时,将继续获取TableAlreadyExistsException。
答案 1 :(得分:0)
也许您可以先删除该列,然后添加具有相同名称的新列。
ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname varchar(100);