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

Mat*_*att 5 hbase phoenix

我有一个HBase安装与一堆现有的表,其中包含一堆数据(我不想删除).我最近发现使用Apache Phoenix能够使用类似SQL的语法查询HBase数据,到目前为止它非常棒.但是,由于我还不完全熟悉各种数据类型以及它们如何映射到我在HBase中存储的Java类型,有时候我弄错了.如果我有一个HBase列,我存储为

Bytes.toBytes(Long long)
Run Code Online (Sandbox Code Playgroud)

我不小心创建了我的凤凰专栏作为varchar,我怎么能在不丢失所有数据的情况下更改Phoenix列?如果我做

alter table "mytable" add "myfamily"."mycolumn" unsigned_long
Run Code Online (Sandbox Code Playgroud)

然后

alter table "mytable" drop column "mycolumn"
Run Code Online (Sandbox Code Playgroud)

然后是

alter table "mytable" add "myfamily"."mycolumn" varchar
Run Code Online (Sandbox Code Playgroud)

我的所有HBase数据都从底层的"mycolumn"列中删除了!解决这个问题的最佳方法是什么?

我读到了有关设置参数的信息

phoenix.schema.dropMetaData
Run Code Online (Sandbox Code Playgroud)

为假,听起来就像我想要的那样,但我无法弄清楚我实际设置的位置.当登录到Phoenix时,我可以在Squirrel中发出一些命令将其设置为false吗?或者它是一个环境变量?

在此先感谢您的帮助!

编辑1

我在Phoenix中创建了一个虚拟表,其中包含每种类型的列,然后在system.catalog表中查找它以获取表示每种数据类型的数字.然后我使用以下命令

upsert into system.catalog (table_name, column_name, column_family, data_type) values ('mytable','mycolumn','mycf',3)
Run Code Online (Sandbox Code Playgroud)

将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
Run Code Online (Sandbox Code Playgroud)

编辑2

通过从SYSTEM.CATALOG和SYSTEM.STATS中删除表的所有条目,似乎可以从Phoenix中删除表而不触及底层HBase表.然后可以使用所需的列类型重新创建该表.不知道这可能对我的HBase表有任何可怕的负面影响!

小智 1

Phoenix 将所有表的元数据存储在另一个名为 SYSTEM_CATALOG 的 HBase 表中。当给出 ALTER 命令时,该参数 phoenix.schema.dropMetaData
强制从目录表中删除元数据。

如果将其设置为 false,则下次创建同名表时,将不断收到 TableAlreadyExistsException。