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

如何在不丢失HBase数据的情况下更改Apache Phoenix中列的数据类型?,hbase,phoenix,Hbase,Phoenix,我安装了一个HBase,其中有一组现有表,其中有一组数据(我不希望删除这些数据)。我最近发现使用ApachePhoenix可以使用类似SQL的语法查询HBase数据,到目前为止,它非常出色。然而,由于我还不完全熟悉各种数据类型以及它们如何映射到我存储在HBase中的Java类型,所以有时我会弄错。如果我有一个HBase列存储为 Bytes.toBytes(Long long) 我意外地将Phoenix列创建为varchar,现在如何更改Phoenix列而不丢失所有数据?如果我这样做 alter

我安装了一个HBase,其中有一组现有表,其中有一组数据(我不希望删除这些数据)。我最近发现使用ApachePhoenix可以使用类似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
到false,这听起来正是我想要的,但我不知道我在哪里设置了这个。登录到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

供参考:

编辑2


通过从SYSTEM.CATALOG和SYSTEM.STATS中删除表的所有条目,似乎可以在不接触基础HBase表的情况下从Phoenix中删除表。然后可以使用所需的列类型重新创建该表。还不知道这是否会对我的HBase表产生任何可怕的负面影响

Phoenix将所有表的元数据存储在另一个名为SYSTEM_CATALOG的HBase表中。参数
phoenix.schema.dropMetaData

在发出ALTER命令时,强制从目录表中删除元数据


如果将其设置为false,则下次创建具有相同名称的表时,将继续获取TableReadyExistsException

也许您可以先删除该列,然后添加同名的新列

ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname varchar(100);

在SYSTEM.CATALOG表中,我可以看到一个名为DATA_TYPE的列—是否可以手动编辑此列中的值,或者此表是只读的?此外,这些值似乎存储为整数(例如12=varchar,16=boolean)。是否有整数到数据类型映射的指南?(我可以随时查看源代码,但如果它位于一个漂亮的网页上,则更容易:))不幸的是,如果您使用的是表而不是视图,删除该列将擦除该列中的所有数据。。。
ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname varchar(100);