当前位置: 首页 > 知识库问答 >
问题:

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

谭健柏
2023-03-14

我安装了一个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数据都会从底层的“mybar”列中删除!解决这个问题的最佳方法是什么?

我读到关于设置参数的内容

phoenix.schema.dropMetaData

改为false,这听起来正是我想要的,但是我不知道我实际上在哪里设置了这个。当登录到Phoenix时,是否可以在Squirrel中发出一些命令来将其设置为false?还是它是一个环境变量?

提前感谢您的帮助!

编辑1

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

upsert into system.catalog (table_name, column_name, column_family, data_type) values ('mytable','mycolumn','mycf',3)

将mycolumn的类型更改为十进制。然而,当我查询mytable时,mycolumn仍然是unsigned\u 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

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

共有2个答案

姜弘化
2023-03-14

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

ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname varchar(100);
乐正迪
2023-03-14

Phoenix将所有表的元数据存储在另一个名为SYSTEM\u CATALOG的HBase表中。参数phoenix。架构。当发出ALTER命令时,dropMetaData将强制从目录表中删除元数据。

如果将其设置为false,则下次创建同名表时,将继续获取TableAlreadyExistsException。

 类似资料:
  • 问题内容: 我想更改数据库表的列位置而不丢失数据。 例如: 当前表: 到 问题答案: 试试这个:

  • 我想在不丢失数据的情况下更改数据库表的列位置。 例如: 当前表格: 到

  • 问题内容: 我正在使用SQL数据库,我有一列名为“价格”。创建数据库后,将“价格”列设置为“我”,需要将其类型更改为不丢失数据库中的数据。这应该通过SQL脚本来完成 我想到了创建一个新列,将数据移到其中,删除旧列,然后重命名新创建的列。 有人可以帮我举个例子吗?在SQL中也有一个函数可以将字符串解析为十进制? 谢谢 问题答案: 您无需添加新列两次,只需在更新新列后删除旧列即可: 请注意,如果不是数

  • 本文向大家介绍在某些情况下如何更改R数据帧中的列?,包括了在某些情况下如何更改R数据帧中的列?的使用技巧和注意事项,需要的朋友参考一下 有时,特定列的列值与另一列有某种关系,我们可能需要根据某些条件来更改该特定列的值。我们需要进行此更改,以检查列值的更改如何对所考虑的两个列之间的关系产生影响。在R中,我们可以使用单个方括号来更改列值。 示例 请看以下数据帧- 假设我们想从第2列(x2)值中减去2,

  • 我有一个opencv的mat有M行和3列,有没有一种方法可以重新排序mat,使第一列和最后一列(即第三列)被切换,而中间的一列保持在不复制数据的位置?

  • 这是我第二次使用它,也是我第一次得到非常好的帮助,所以我希望我能得到更多的帮助! 背景: 我的程序通过创建一个保存余额和其他东西的对象来测试我的 类。说明说我需要覆盖子类的“提款”和“存款”方法以跟踪交易。 我这样做了,但它不使用当前余额,而是只发送一个0。我希望能够保留新的余额,以便它实际从当前余额中提取或存款。 抱歉,如果这毫无意义,如果需要任何澄清,我将尝试以不同的方式解释。 以下是我的代码