
# HBase BulkLoad工具配置文件说明
#### 操作场景
该章节主要介绍使用BulkLoad工具的其他配置操作以获取需要查看的数据。
#### 约束与限制
列的名称不能包含特殊字符，只能由字母、数字和下划线组成。
#### 配置自定义的组合rowkey
使用BulkLoad工具批量导入HBase数据时，支持用户自定义组合rowkey。BulkLoad组合rowkey即通过一些规则将多个列名经过一些自定义处理，组合生成新的rowkey。
关于组合rowkey在"configuration.xml"文件中的配置如下所示，该样例中定义组合rowkey为列"SMS_ID"、"SMS_NAME"的取第二个字符开始的三个字符以及"SMS_ADDRESS"的反转（各部分用'_'连接）。
```
<columns> 
                         <column index="1" type="int">SMS_ID</column> 
                         <column index="2" type="string">SMS_NAME</column> 
                         <column index="3" type="string">SMS_ADDRESS</column> 
                 </columns> 
                 <rowkey> 
                        SMS_ID+'_'+substring(SMS_NAME,1,4)+'_'+reverse(SMS_ADDRESS)
                 </rowkey>
```
表1rowkey字段处理函数 
| 函数原型                                                        | 描述                     | 示例                                                                                  |
|:---|:---|:---|
| format(data,"DataType")                                     | 格式化字符串数据。              | **format(data,"0.000")**是指将数据按照"0.000"格式输出。                                         |
| converse(data,"yyyy-MM-dd","yyyyMMdd")                      | 转化日期格式。                | **converse(data,"yyyy-MM-dd","yyyyMMdd")**是指将日期格式从"yyyy-MM-dd"转化为"yyyyMMdd"。        |
| rand                                                        | 随机一个整数，只支持int类型。       | 无。                                                                                  |
| replace(data,"A","B")                                       | 数据替换。                  | **replace(data,"A","B")**是指将A用B替换。                                                  |
| reverse(data)                                               | 将字符串反转。                | **reverse(ABC)**是指将"ABC"反转成"CBA"。                                                   |
| substring(data,Length1,Length2), or substring(data,Length3) | 截取字符串。                 | **substring(data,1,5), or substring(data,3)**是指将Data字符串进行截取\[1,5)或\[3,data.length)。 |
| to_number("data")                                           | 将字符串转化成数值型，支持返回Long类型。 | **to_number("123")**是指将字符串"123"转化为数值123，注意当前Data必须为数值。                              |
   
#### 配置自定义rowkey实现
使用BulkLoad工具批量导入HBase数据时，支持用户自定义的组合rowkey实现。用户可编写rowkey实现代码，导入时根据该代码逻辑进行组合rowkey导入。
配置自定义rowkey实现步骤如下：
1. 用户编写自定义rowkey的实现类，需要继承接口，该接口所在的Jar包路径为"*客户端安装目* *录* /HBase/hbase/lib/hbase-it-bulk-load-\*.jar"：
   
   ```
   [com.huawei.hadoop.hbase.tools.bulkload.RowkeyHandlerInterface]，
   ```
   实现接口中方法：
   ```
   byte[] getRowkeyBytes(String[] colsValues, RegulationDomain regulation)
   ```
   其中：
   - 传入参数"colsValues"为原始数据中的一行数据集合，每个元素为一列。
   
   - 传入参数"regulation"为配置导入文件信息（一般情况下并不需要使用）。
   
   
   
   
2. 将该实现类与其依赖包同时打包成Jar文件，保存到HBase客户端所在节点的任意位置并确保执行命令的用户具有读取和执行该Jar包的权限。
3. 在执行导入命令时，增加以下两个参数配置项： 
   - -Dimport.rowkey.jar=*"[2]中Jar包的全路径"*
   
   - -Dimport.rowkey.class=*"用户实现类的全类名"*
   
   
   
   
 
#### 配置自定义组合字段
BulkLoad支持自定义组合字段，把多个列通过追加的方式即多个列串到一块组合成一个列。
关于组合字段H_COMBINE_1的定义如下所示，该样例中H_COMBINE_1由字段"SMS_ADDRESS"、"SMS_NAME"构成。
```
<!-- Define composite columns --> 
                         <composite family="f2">
                                 <!-- 定义拼接字段的类名，且该类必须在客户应用中不存在 --> 
                                 <qualifier class="com.huawei.H_COMBINE_1">H_COMBINE_1</qualifier> 
                                 <columns> 
                                         <column>SMS_ADDRESS</column> 
                                         <column>SMS_NAME</column> 
                                 </columns> 
                         </composite>
```
#### 指定字段数据类型
HBase BulkLoad支持读取原生态数据文件，把数据文件的每个字段映射为HBase定义的字段，并对该字段的数据类型做定义。
您可以在"configuration.xml"文件中定义多个方式来批量导入数据。
指定字段数据类型的配置如下所示，该样例中对"SMS_ID"、"SMS_NAME"、"SMS_ADDRESS"列指定数据类型。
```
<columns> 
                         <column index="1" type="int">SMS_ID</column> 
                         <column index="2" type="string">SMS_NAME</column> 
                         <column index="3" type="string">SMS_ADDRESS</column> 
                 </columns>
```
支持的数据类型包括short、int、long、float、double、boolean和string。
#### 定义不适用的数据行
BulkLoad支持定义不适用数据行的功能，不适用数据行不会存储到HBase中，这些数据会被保存到指定的文件中。
您可以在"configuration.xml"文件中定义多个方式来批量导入数据。
定义不适用的行，配置样例如下所示，即SMS_ID \< 7000 \&\& SMS_NAME == 'HBase'：
```
<!-- Define bad line filter rule --> 
<badlines>SMS_ID &lt; 7000 &amp;&amp; SMS_NAME == 'HBase'</badlines>
```
针对"\<badlines\>"标签中的算符和对应的参数类型如[表2]所示。
 表2算符和对应的参数类型 
| **算符类型** | **参数类型**         |
|:---|:---|
| \&\&     | 对应的参数类型应为布尔型。    |
| \&       | 对应的参数类型应为整数。     |
| \|       | 对应的参数类型应为整数。     |
| \^       | 对应的参数类型应为整数。     |
| /        | 对应的参数类型应为数字。     |
| ==       | 对应的参数类型应为字符串。    |
| \>=      | 对应的参数类型应为数字。     |
| \>       | 对应的参数类型应为数字。     |
| \<\<     | 对应的参数类型应为整数。     |
| \<=      | 对应的参数类型应为数字。     |
| \<       | 对应的参数类型应为数字。     |
| %        | 对应的参数类型应为数字。     |
| \*       | 对应的参数类型应为数字。     |
| !=       | 对应的参数类型应为字符串。    |
| \|\|     | 对应的参数类型应为布尔型。    |
| +        | 对应的参数类型应为数字和字符串。 |
| \>\>     | 对应的参数类型应为整数。     |
| -        | 对应的参数类型应为字符串。    |
| \>\>\>   | 对应的参数类型应为整数。     |
   
#### 配置自定义导入数据的时间戳
该操作仅适用于MRS 3.6.0-LTS及之后版本，HBase BulkLoad支持读取原生态数据文件，把数据文件的每个字段映射为HBase定义的字段，并为所有的字段指定一个统一的时间戳。
如果用户未指定，则默认使用当前时间作为数据的时间戳；导入索引数据时，不支持配置自定义导入数据的时间戳。
配置操作如下：
ImportData工具新增"import.data.timestamp"参数，用户可以通过该参数指定该次任务数据的时间戳，参数值类型为long，例如格式为"1731643262000"，精确到毫秒。参考命令格式如下：
```
hbase com.huawei.hadoop.hbase.tools.bulkload.ImportData -Dimport.data.timestamp=1731643262000 -Dimport.hfile.output="/path/for/output" <xmlfile> <tablename> <inputdir>
```
