我有一个带有一堆现有表的 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 中删除表的所有条目,似乎可以在不触及底层 HBase 表的情况下从 Phoenix 中删除表。然后可以使用所需的列类型重新创建表。还不知道这是否会对我的 HBase 表产生任何可怕的不利影响!