
# 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
   ```
   
   
 
