phoenix大表增加字段的方法

phoenix大表增加字段的方法

文章背景:给phoenix大数据表加字段,一般用官方的alter语句,但有时候会因为表中数据量过多或者其它原因导致超时失败,于是就有了这篇文章,用于讨论怎么给大表增加字段

文章主题:通过改system.catalog表来给phoenix表增加字段

正文:

下面以hbase测试环境演示,

尝试给表MEMBER_TEST增加字段WJH_TEST_COLUMD11

  1. 首先查看目标表在system.catalog表中记录的相关信息

select * from  SYSTEM.CATALOG where TABLE_NAME = 'MEMBER_TEST';

system.catalog里存了表结构的数据,一般一行数据就是一个字段。观察下这个表数据的规律,可以大致明白这些字段的含义,以及字段值出现的规律

  1. 执行sql给表SYSTEM.CATALOG增加一行数据

现在,需要给表MEMBER_TEST增加一个名称为WJH_TEST_COLUMD11的字段,只需要在SYSTEM.CATALOG中增加一条数据即可,例如如下sql可实现

(这个sql改下值也能用来增加其它表的字段,这个sql结构其实就是参考SYSTEM.CATALOG里的其它数据模仿出来的)

执行sql

UPSERT INTO SYSTEM.CATALOG (

       TENANT_ID,

       TABLE_SCHEM,

       TABLE_NAME,

       COLUMN_NAME,

       COLUMN_FAMILY,

       TABLE_SEQ_NUM,

       TABLE_TYPE,

       PK_NAME,

       COLUMN_COUNT,

       SALT_BUCKETS,

       DATA_TABLE_NAME,

       INDEX_STATE,

       IMMUTABLE_ROWS,

       VIEW_STATEMENT,

       DEFAULT_COLUMN_FAMILY,

       DISABLE_WAL,

       MULTI_TENANT,

       VIEW_TYPE,

       VIEW_INDEX_ID,

       DATA_TYPE,

       COLUMN_SIZE,

       DECIMAL_DIGITS,

       NULLABLE,

       ORDINAL_POSITION,

       SORT_ORDER,

       ARRAY_SIZE,

       VIEW_CONSTANT,

       IS_VIEW_REFERENCED,

       KEY_SEQ,

       LINK_TYPE,

       TYPE_NAME,

       REMARKS,

       SELF_REFERENCING_COL_NAME,

       REF_GENERATION,

       BUFFER_LENGTH,

       NUM_PREC_RADIX,

       COLUMN_DEF,

       SQL_DATA_TYPE,

       SQL_DATETIME_SUB,

       CHAR_OCTET_LENGTH,

       IS_NULLABLE,

       SCOPE_CATALOG,

       SCOPE_SCHEMA,

       SCOPE_TABLE,

       SOURCE_DATA_TYPE,

       IS_AUTOINCREMENT,

       INDEX_TYPE,

       INDEX_DISABLE_TIMESTAMP,

       STORE_NULLS,

       BASE_COLUMN_COUNT,

       IS_ROW_TIMESTAMP,

       TRANSACTIONAL,

       UPDATE_CACHE_FREQUENCY,

       IS_NAMESPACE_MAPPED,

       AUTO_PARTITION_SEQ,

       APPEND_ONLY_SCHEMA,

       GUIDE_POSTS_WIDTH,

       COLUMN_QUALIFIER,

       IMMUTABLE_STORAGE_SCHEME,

       ENCODING_SCHEME,

       QUALIFIER_COUNTER,

       USE_STATS_FOR_PARALLELIZATION,

       TRANSACTION_PROVIDER

)

VALUES

       (

              NULL,

              NULL,

              'MEMBER_TEST',

              'WJH_TEST_COLUMD11',

              'BILL',

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              12,

              NULL,

              NULL,

              1,

              18,

              2,

              NULL,

              NULL,

              FALSE,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              FALSE,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              NULL,

              CAST( '574a485f544553545f434f4c554d443131' AS BINARY ),

              NULL,

              NULL,

              NULL,

              NULL,

NULL

       );

在这个sql中,

TABLE_NAME表示表的名称,

COLUMN_NAME表示需要增加的字段名称

COLUMN_FAMILY 表示列族,

DATA_TYPE表示字段的类型,12代表varchar的意思

NULLABLE表示是否可以空

SORT_ORDER不知道什么意思,和其它字段一样填2就行

ORDINAL_POSITION表示列的序号,需要找出这个表中最大的序号,然后加1

COLUMN_QUALIFIER表示字段名称的16进制表示,在这个网站将字符串转化为16进制,将16进制填入函数CAST('xxxxxxx' as BINARY)中即可

其它字段值可参考表SYSTEM.CATALOG 的其它数据填入

字符串转16进制_16进制转换、十六进制转换_汇享在线工具箱

  1. 清理服务器端缓存

执行完上述sql后,直接用程序也好,用命令行也好,可视化操作工具也好,是查不到这个字段的。因为服务器端对字段做了缓存处理,需要清除服务器端的缓存,重新加载表字段才行。

如下语句可清理服务器端缓存,hbase shell中执行

disable 'SYSTEM:CATALOG'

enable 'SYSTEM:CATALOG'

 

  1. 重启相关应用和可视化工具

清理完服务器的缓存后,去查这个新加的字段,会发现还是提示字段找不到,这是因为客户端也有这个字段的缓存,需要去掉客户端的缓存才行,需要重启客户端服务或者是可视化工具,才能将缓存清理掉。

java应用要重启,可视化工具就关掉重新打开,phoenix的sqlline要退出重新进

现在,这个新加入的字段已经能正常使用了!

  1. 注意:
  1. 最好在测试环境尝试过,再上生产操作
  2. 通过这种方法加字段需要重启用到这个表的相关应用,不然应用识别不出有这个字段

相关博客文章连接:

phoenix表结构修改(新增字段,字段类型修改)_fuyun6363的博客-CSDN博客_phoenix添加字段

phoenix5表结构变更,修改字段类型_刘本龙的专栏-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值