phoenix大表增加字段的方法
文章背景:给phoenix大数据表加字段,一般用官方的alter语句,但有时候会因为表中数据量过多或者其它原因导致超时失败,于是就有了这篇文章,用于讨论怎么给大表增加字段
文章主题:通过改system.catalog表来给phoenix表增加字段
正文:
下面以hbase测试环境演示,
尝试给表MEMBER_TEST增加字段WJH_TEST_COLUMD11
- 首先查看目标表在system.catalog表中记录的相关信息
select * from SYSTEM.CATALOG where TABLE_NAME = 'MEMBER_TEST';
system.catalog里存了表结构的数据,一般一行数据就是一个字段。观察下这个表数据的规律,可以大致明白这些字段的含义,以及字段值出现的规律
- 执行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进制转换、十六进制转换_汇享在线工具箱
- 清理服务器端缓存
执行完上述sql后,直接用程序也好,用命令行也好,可视化操作工具也好,是查不到这个字段的。因为服务器端对字段做了缓存处理,需要清除服务器端的缓存,重新加载表字段才行。
如下语句可清理服务器端缓存,hbase shell中执行
disable 'SYSTEM:CATALOG'
enable 'SYSTEM:CATALOG'
- 重启相关应用和可视化工具
清理完服务器的缓存后,去查这个新加的字段,会发现还是提示字段找不到,这是因为客户端也有这个字段的缓存,需要去掉客户端的缓存才行,需要重启客户端服务或者是可视化工具,才能将缓存清理掉。
java应用要重启,可视化工具就关掉重新打开,phoenix的sqlline要退出重新进
现在,这个新加入的字段已经能正常使用了!
- 注意:
- 最好在测试环境尝试过,再上生产操作
- 通过这种方法加字段需要重启用到这个表的相关应用,不然应用识别不出有这个字段
相关博客文章连接: