
# 配置Hive对接Paimon
#### 操作场景
本章节指导用户如何在Hive客户端执行Paimon表相关操作。
#### 约束与限制
- 仅支持使用MapReduce和Tez引擎在Hive客户端查询Paimon表数据。不支持创建、修改Paimon表等DDL操作。
- 如果需要使用HetuEngine查询Hive客户端创建的Paimon表，表必须创建在单独的database下（即database的Location必须为"warehouse路径 + *database名称* + *.db后缀* "，即"*warehouse路径* /*database名称* .db"），不能使用**default** database，否则HetuEngine查询会报错提示表不存在。
 
#### 在Hive客户端执行Paimon表查询操作
1. 使用客户端安装用户登录安装了客户端的节点，执行以下命令配置环境变量并认证用户： 
   切换至客户端安装目录：
   ```
   cd 客户端安装目录
   ```
   配置环境变量：
   ```
   source bigdata_env
   ```
   认证用户，集群未启用Kerberos认证（普通模式）请跳过此操作：
   ```
   kinit 组件业务用户
   ```
   
   
2. 用Spark或Flink写入Paimon表数据后，再使用Hive执行Paimon表相关查询操作。 
   - 如下为在Spark中创建Paimon表**test_paimon_student** 和**test_paimon_data_type** ，插入数据，并使用Hive查询。
     1. 登录Spark客户端访问Paimon表，命令为：
        ```
        spark-sql \
        --jars {客户端安装路径}/Spark/spark/jars/paimon/{paimon-spark完整包名},{客户端安装路径}/Spark/spark/jars/paimon/{paimon-hive-connector-common完整包名} \
        --driver-class-path {客户端安装路径}/Spark/spark/jars/paimon/{paimon-spark完整包名}:{客户端安装路径}/Spark/spark/jars/paimon/{paimon-hive-connector-common完整包名} \
        --conf spark.sql.catalog.paimon=org.apache.paimon.spark.SparkCatalog \
        --conf spark.sql.catalog.paimon.warehouse=${HIVE_METASTORE_WAREHOUSE_DIR} \
        --conf spark.sql.extensions=org.apache.paimon.spark.extensions.PaimonSparkSessionExtensions \
        --conf spark.sql.catalog.paimon.metastore=hive \
        --conf spark.sql.catalog.paimon.uri=${HIVE_METASTORE_URI_DEFAULT}
        ```
        其中：
        - *{客户端安装路径}*需要替换为实际的客户端路径。
        
        - "*${HIVE_METASTORE_WAREHOUSE_DIR}*"可登录Manager界面，选择"集群 \> 服务 \> Hive \> 配置 \> 全部配置 \> MetaStore（角色）"，搜索"hive.metastore.warehouse.dir"参数获取。
        
        - *"${HIVE_METASTORE_URI_DEFAULT}* *"*可登录Manager界面，选择"集群 \> 服务 \> Hive \> 配置"，搜索"HIVE_METASTORE_URI_DEFAULT"参数获取。
        
        
        例如：
        ```
        spark-sql \
        --jars /opt/client/Spark/spark/jars/paimon/paimon-spark-3.5*.jar,/opt/client/Spark/spark/jars/paimon/paimon-hive-connector-common-*.jar \
        --driver-class-path /opt/client/Spark/spark/jars/paimon/paimon-spark-3.5-1.1.1*.jar:/opt/client/Spark/spark/jars/paimon/paimon-hive-connector-common-1.1.1*.jar \
        --conf spark.sql.catalog.paimon=org.apache.paimon.spark.SparkCatalog \
        --conf spark.sql.catalog.paimon.warehouse=/user/hive/warehouse \
        --conf spark.sql.extensions=org.apache.paimon.spark.extensions.PaimonSparkSessionExtensions \
        --conf spark.sql.catalog.paimon.metastore=hive \
        --conf spark.sql.catalog.paimon.uri=thrift://192.168.64.140:21088
        ```
        
     
     2. 切换至"paimon.default"数据库：
        ```
        USE paimon.default;
        ```
        
     
     3. 创建Paimon表**test_paimon_student** 并插入数据：
        创建表：
        ```
        create table test_paimon_student(id int, name string);
        ```
        插入数据：
        ```
        insert into test_paimon_student values(1, 'zhangsan');
        ```
        
     
     4. 创建Paimon表**test_paimon_data_type** 并插入数据：
        创建表：
        ```
        create table test_paimon_data_type(int_type int,string_type string,float_type float,double_type double,decimal_type decimal(10,8),boolean_type boolean,smallint_type smallint,tinyint_type tinyint,bigint_type bigint,timestamp_type timestamp,binary_type binary,varchar_type varchar(10),date_type date);
        ```
        插入数据：
        ```
        insert into table test_paimon_data_type values(1,'string1',1.21211111,1.2222222222,1.3333333,true,1,2,555555555555,'2016-08-23 15:00:00','0101','varchar10','2016-08-23');
        ```
        
      
   
   - 复杂查询
     1. 执行以下命令登录Hive客户端：
        ```
        beeline
        ```
        
     
     2. Paimon表**join** Paimon表：
        ```
        select * from test_paimon_student a join test_paimon_data_type b on a.id = b.int_type;
        ```
        图1Paimon表**join** Paimon表查询操作   
        ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002465830588.png "点击放大") 
     
     3. Paimon表**union** /**union all** Paimon表：
        ```
        select * from test_paimon_student a union all select * from test_paimon_student b;
        ```
        图2**union** /**union all** 查询   
        ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002499029541.png) 
     
     4. Paimon表**join** Hive表：
        创建Hive表：
        ```
        create table test_hive_student(id int, name string) stored as orc;
        ```
        插入数据：
        ```
        insert into test_hive_student values(1, 'zhangsan_hive');
        ```
        执行Paimon表**join** Hive表查询操作：
        ```
        select * from test_paimon_student a join test_hive_student b on a.id = b.id;
        ```
        图3Paimon表**join** Hive表查询   
        ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002499109589.png "点击放大") 
     
     5. Paimon表**union** /**union all** Hive表：
        ```
        select * from test_paimon_student a union all select * from test_hive_student b;
        ```
        图4Paimon表**union** /**union all** Hive表查询   
        ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002465990220.png) 
      
   
   - 表Schema变更后Paimon表查询 **Schema变更场景需要使用Spark进行Paimon表结构变更，Hive只用于查询Paimon表。**
     以下示例为使用Hive查询Schema变更后的Paimon表：
     1. 登录Spark客户端访问Paimon表，命令为：
        ```
        spark-sql \
        --jars {客户端安装路径}/Spark/spark/jars/paimon/{paimon-spark完整包名},{客户端安装路径}/Spark/spark/jars/paimon/{paimon-hive-connector-common完整包名} \
        --driver-class-path {客户端安装路径}/Spark/spark/jars/paimon/{paimon-spark完整包名}:{客户端安装路径}/Spark/spark/jars/paimon/{paimon-hive-connector-common完整包名} \
        --conf spark.sql.catalog.paimon=org.apache.paimon.spark.SparkCatalog \
        --conf spark.sql.catalog.paimon.warehouse=${HIVE_METASTORE_WAREHOUSE_DIR} \
        --conf spark.sql.extensions=org.apache.paimon.spark.extensions.PaimonSparkSessionExtensions \
        --conf spark.sql.catalog.paimon.metastore=hive \
        --conf spark.sql.catalog.paimon.uri=${HIVE_METASTORE_URI_DEFAULT}
        ```
        其中：
        - *{客户端安装路径}*需要替换为实际的客户端路径。
        
        - "*${HIVE_METASTORE_WAREHOUSE_DIR}*"可登录Manager界面，选择"集群 \> 服务 \> Hive \> 配置 \> 全部配置 \> MetaStore（角色）"，搜索"hive.metastore.warehouse.dir"参数获取。
        
        - "*${HIVE_METASTORE_URI_DEFAULT}*"可登录Manager界面，选择"集群 \> 服务 \> Hive \> 配置"，搜索"HIVE_METASTORE_URI_DEFAULT"参数获取。
        
        
        例如：
        ```
        spark-sql \
        --jars /opt/client/Spark/spark/jars/paimon/paimon-spark-3.5*.jar,/opt/client/Spark/spark/jars/paimon/paimon-hive-connector-common-*.jar \
        --driver-class-path /opt/client/Spark/spark/jars/paimon/paimon-spark-3.5-1.1.1*.jar:/opt/client/Spark/spark/jars/paimon/paimon-hive-connector-common-1.1.1*.jar \
        --conf spark.sql.catalog.paimon=org.apache.paimon.spark.SparkCatalog \
        --conf spark.sql.catalog.paimon.warehouse=/user/hive/warehouse \
        --conf spark.sql.extensions=org.apache.paimon.spark.extensions.PaimonSparkSessionExtensions \
        --conf spark.sql.catalog.paimon.metastore=hive \
        --conf spark.sql.catalog.paimon.uri=thrift://192.168.64.140:21088
        ```
        
     
     2. 对Paimon表添加字段。 切换至Paimon表所在数据库：
        ```
        USE paimon.default;
        ```
        对Paimon表添加字段：
        ```
        alter table test_paimon_student add columns(age int);
        ```
        添加字段后重新插入1条新数据：
        ```
        insert into test_paimon_student values(2, 'zhangsan2', 12);
        ```
        图5添加字段并插入数据   
        ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002465830592.png "点击放大") 
     
     3. 退出Spark客户端。
     
     4. 使用Hive查询Schema变更后的Paimon表。 登录Hive客户端：
        ```
        beeline
        ```
        查询Paimon表：
        ```
        select * from test_paimon_student;
        ```
        图6使用Hive查询Paimon表   
        ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002499029545.png "点击放大") 
      
   
   - Paimon表属性查询：
     登录Hive客户端：
     ```
     beeline
     ```
     查询Paimon表属性：
     ```
     desc formatted test_paimon_student;
     ```
     例如，命令执行后，可查看"storage_handler"是否为"org.apache.paimon.hive.PaimonStorageHandler"。
     ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002499109597.png "点击放大")
     
   
   
   
   
 
#### 支持的数据类型
Hive对接Paimon支持的数据类型请参见[表1]
 表1支持的数据类型 
| Hive数据类型                          | Paimon数据类型                                                                                                                                                                                              |
|:---|:---|
| StructTypeInfo                    | RowType                                                                                                                                                                                                 |
| MapTypeInfo                       | MapType                                                                                                                                                                                                 |
| ListTypeInfo                      | ArrayType                                                                                                                                                                                               |
| PrimitiveTypeInfo("boolean")      | BooleanType                                                                                                                                                                                             |
| PrimitiveTypeInfo("tinyint")      | TinyIntType                                                                                                                                                                                             |
| PrimitiveTypeInfo("smallint")     | SmallIntType                                                                                                                                                                                            |
| PrimitiveTypeInfo("int")          | IntType                                                                                                                                                                                                 |
| PrimitiveTypeInfo("bigint")       | BigIntType                                                                                                                                                                                              |
| PrimitiveTypeInfo("float")        | FloatType                                                                                                                                                                                               |
| PrimitiveTypeInfo("double")       | DoubleType                                                                                                                                                                                              |
| CharTypeInfo(length)              | CharType(length)                                                                                                                                                                                        |
| PrimitiveTypeInfo("string")       | VarCharType(VarCharType.MAX_LENGTH)                                                                                                                                                                     |
| VarcharTypeInfo(length)           | VarCharType(length), length is less than VarCharType.MAX_LENGTH                                                                                                                                         |
| PrimitiveTypeInfo("date")         | DateType                                                                                                                                                                                                |
| PrimitiveTypeInfo("timestamp")    | TimestampType 注意： 使用Spark创建包含该字段的表前，需执行以下命令设置"spark.sql.timestampType"为"TIMESTAMP_NTZ"： ``` set spark.sql.timestampType=TIMESTAMP_NTZ; ``` |
| DecimalTypeInfo(precision, scale) | DecimalType(precision, scale)                                                                                                                                                                           |
| PrimitiveTypeInfo("binary")       | VarBinaryType, BinaryType                                                                                                                                                                               |
   
#### TimeStamp类型字段注意事项
使用Spark创建带TimeStamp类型字段的表前，如果未设置"spark.sql.timestampType"参数值为"TIMESTAMP_NTZ"，则创建的TimeStamp字段类型默认为"timestamp with local time zone"，在Hive中查询数据时会显示具体时区。在Hive中查询时如果根据该时间字段进行过滤，但是没有带时区信息则无法正确匹配数据。例如，表中的原始数据如下，"created_at"为"timestamp with local time zone"字段：
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002562627845.png "点击放大")
在Hive中使用以下命令查询数据，查询结果为空：
```
SELECT * FROM test_filter WHERE created_at BETWEEN '2024-01-02 00:00:00' AND '2024-01-05 23:59:59';
```
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002531707934.png "点击放大")
需要将SQL中的时间转换为带时区的时间后再进行查询，例如，转换为以下命令：
```
SELECT * FROM test_filter WHERE created_at BETWEEN CAST('2024-01-02 00:00:00' AS TIMESTAMP WITH LOCAL TIME ZONE) AND CAST('2024-01-05 23:59:59' AS TIMESTAMP WITH LOCAL TIME ZONE);
```
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002562787811.png "点击放大")
