
# 配置BulkloadTool工具支持解析自定义分隔符
#### 操作场景
Phoenix提供了批量数据导入工具CsvBulkloadTool，在此特性基础上，支持导入自定义分隔符文件，即用户可以采用限定长度内的任意可见字符进行组合作为分隔符来导入数据文件。
#### 约束与限制
- 该章节内容仅适用于MRS 3.2.0及之后版本。
- 自定义分隔符不能为空字符串。
- 自定义分隔符长度必须小于等于16个字符。 自定义分隔符过长会影响解析效率，降低数据导入速度，且会导致有效数据占比率降低，使得文件占用过大，因此不建议使用过长的分隔符。
  
- 自定义分隔符必须为可见字符。 自定义分隔符白名单，避免可能的注入问题，目前支持的分隔字符包括：字母、数字、特殊符号（\`\~!@#$%\^\&\*()\\\\-_=+\\\\\[\\\\\]{}\\\\\\\\\|;:'\\",\<\>./?）。
  
- 自定义分隔符不能首尾相同。
 
#### 新增参数介绍
基于开源CsvBulkloadTool，新增以下两个参数：
- **--multiple-delimiter(-md)**
  用于指定自定义分隔符，当此命令参数存在时，会优先生效，覆盖掉原命令中的**-d**参数。
  
- **--multiple-delimiter-skip-check(-mdsc)**
  用于跳过分隔符长度及白名单校验，不建议使用。
  
 
#### 按自定义分隔符导入数据至HBase
1. 将数据文件上传到客户端所在节点，例如上传名为"data.csv"的文件到客户端所在节点的"/opt/test"目录下，分隔符为"**\|\^\[** "，文件内容如下所示：
   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001724746749.png "点击放大")
   
   
2. 以客户端安装用户，登录安装客户端的节点。
3. 执行以下命令切换到客户端目录： 
   ```
   cd 客户端安装目录
   ```
   
   
4. 执行以下命令配置环境变量： 
   ```
   source bigdata_env
   ```
   
   
5. 如果当前集群已启用Kerberos认证（安全模式），执行以下命令认证当前用户，当前用户需要具有创建HBase表的权限和HDFS的操作权限： 
   ```
   kinit 组件业务用户
   ```
   如果当前集群未启用Kerberos认证（普通模式），则执行以下命令设置Hadoop用户名：
   ```
   export HADOOP_USER_NAME=hbase
   ```
   
   
6. 执行以下命令，把[1]的数据文件"data.csv"上传至HDFS目录，例如上传至"/tmp"目录：
   
   ```
   hdfs dfs -put /opt/test/data.csv /tmp
   ```
   
   
7. 执行以下命令登录Phoenix客户端： 
   ```
   sqlline.py
   ```
   
   
8. 执行以下命令创建**TEST** 表：
   
   ```
   CREATE TABLE TEST ( ID INTEGER NOT NULL PRIMARY KEY, NAME VARCHAR, AGE INTEGER, ADDRESS VARCHAR, GENDER BOOLEAN, A DECIMAL, B DECIMAL ) split on (1, 2, 3,4,5,6,7,8,9);
   ```
   表创建成功后，执行以下命令退出Phoenix命令行：
   ```
   !quit
   ```
   
   
9. 执行以下命令导入数据： 
   ```
   hbase org.apache.phoenix.mapreduce.CsvBulkLoadTool -md '自定义分隔符' -t 表名 -i 数据文件路径
   ```
   例如，导入数据文件"data.csv"到**TEST**表：
   ```
   hbase org.apache.phoenix.mapreduce.CsvBulkLoadTool -md '|^[' -t TEST -i /tmp/data.csv
   ```
   
   
10. 执行以下命令，查看导入表**TEST** 的数据：
    
    登录Phoenix客户端：
    ```
    sqlline.py
    ```
    查询表**TEST**的数据：
    ```
    SELECT * FROM TEST LIMIT 10;
    ```
    如[图1]所示，文件"data.csv"中的数据已导入至**TEST**表中。
    图1查询表**TEST** 数据   
    ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001676907266.png "点击放大")
    
    
 
