5

我有一个带有一堆现有表的 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 表产生任何可怕的不利影响!

4

2 回答 2

1

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

如果设置为false,下次创建同名表时,会不断出现TableAlreadyExistsException。

于 2015-02-13T01:25:19.263 回答
0

也许您可以先删除该列,然后添加具有相同名称的新列。

ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname varchar(100);
于 2015-09-07T06:54:24.077 回答