如何在不丢失HBase数据的情况下更改Apache Phoenix中列的数据类型?

时间:2015-02-12 20:41:10

标签: hbase phoenix

我有一个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表产生任何可怕的负面影响!

2 个答案:

答案 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);