gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:40:15 25 4
gpt4 key购买 nike

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

最佳答案

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

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

关于hbase - 如何在不丢失 HBase 数据的情况下更改 Apache Phoenix 中列的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com