更新时间:2022-02-22 GMT+08:00

Phoenix BulkLoad Tool限制

问题

当更新索引字段数据时,若用户表已经存在一批数据,则BulkLoad工具不能更新全局和局部可变索引。

回答

问题分析

  1. 创建表。
    CREATE TABLE TEST_TABLE(
    DATE varchar not null,
    NUM integer not null,
    SEQ_NUM integer not null,
    ACCOUNT1 varchar not null,
    ACCOUNTDES varchar,
    FLAG varchar,
    SALL double,
    CONSTRAINT PK PRIMARY KEY (DATE,NUM,SEQ_NUM,ACCOUNT1)
    );
  2. 创建全局索引

    CREATE INDEX TEST_TABLE_INDEX ON TEST_TABLE(ACCOUNT1,DATE,NUM,ACCOUNTDES,SEQ_NUM);

  3. 插入数据

    UPSERT INTO TEST_TABLE (DATE,NUM,SEQ_NUM,ACCOUNT1,ACCOUNTDES,FLAG,SALL) values ('20201001',30201001,13,'367392332','sffa1','','');

  4. 执行BulkLoad任务更新数据
    hbase org.apache.phoenix.mapreduce.CsvBulkLoadTool -t TEST_TABLE -i /tmp/test.csv,test.csv内容如下:

    20201001

    30201001

    13

    367392332

    sffa888

    1231243

    23

  5. 问题现象:无法直接更新之前存在的索引数据,导致存在两条索引数据。
    +------------+-----------+-----------+---------------+----------------+
    | :ACCOUNT1  |   :DATE   |   :NUM    | 0:ACCOUNTDES  | :SEQ_NUM  |
    +------------+-----------+-----------+---------------+----------------+
    | 367392332  | 20201001  | 30201001  | sffa1          |  13                    |
    | 367392332  | 20201001  | 30201001  | sffa888       | 13                    |
    +------------+-----------+-----------+---------------+----------------+

解决方法

  1. 删除旧的索引表。

    DROP INDEX TEST_TABLE_INDEX ON TEST_TABLE;

  2. 异步方式创建新的索引表。

    CREATE INDEX TEST_TABLE_INDEX ON TEST_TABLE(ACCOUNT1,DATE,NUM,ACCOUNTDES,SEQ_NUM) ASYNC;

  3. 索引重建。

    hbase org.apache.phoenix.mapreduce.index.IndexTool --data-table TEST_TABLE --index-table TEST_TABLE_INDEX --output-path /user/test_table