配置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表查询操作
- 使用客户端安装用户登录安装了客户端的节点,执行以下命令配置环境变量并认证用户:
切换至客户端安装目录:
cd 客户端安装目录
配置环境变量:
source bigdata_env
认证用户,集群未启用Kerberos认证(普通模式)请跳过此操作:
kinit 组件业务用户
- 用Spark或Flink写入Paimon表数据后,再使用Hive执行Paimon表相关查询操作。
- 如下为在Spark中创建Paimon表test_paimon_student和test_paimon_data_type,插入数据,并使用Hive查询。
- 登录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
- 切换至“paimon.default”数据库:
USE paimon.default;
- 创建Paimon表test_paimon_student并插入数据:
创建表:
create table test_paimon_student(id int, name string);
插入数据:
insert into test_paimon_student values(1, 'zhangsan');
- 创建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');
- 登录Spark客户端访问Paimon表,命令为:
- 复杂查询
- 执行以下命令登录Hive客户端:
beeline
- Paimon表join Paimon表:
select * from test_paimon_student a join test_paimon_data_type b on a.id = b.int_type;
图1 Paimon表join Paimon表查询操作
- Paimon表union/union all Paimon表:
select * from test_paimon_student a union all select * from test_paimon_student b;
图2 union/union all查询
- 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;
图3 Paimon表join Hive表查询
- Paimon表union/union all Hive表:
select * from test_paimon_student a union all select * from test_hive_student b;
图4 Paimon表union/union all Hive表查询
- 执行以下命令登录Hive客户端:
- 表Schema变更后Paimon表查询
Schema变更场景需要使用Spark进行Paimon表结构变更,Hive只用于查询Paimon表。
以下示例为使用Hive查询Schema变更后的Paimon表:
- 登录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
- 对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 添加字段并插入数据
- 退出Spark客户端。
- 使用Hive查询Schema变更后的Paimon表。
beeline
查询Paimon表:select * from test_paimon_student;
图6 使用Hive查询Paimon表
- 登录Spark客户端访问Paimon表,命令为:
- Paimon表属性查询:
查询Paimon表属性:
desc formatted test_paimon_student;
例如,命令执行后,可查看“storage_handler”是否为“org.apache.paimon.hive.PaimonStorageHandler”。

- 如下为在Spark中创建Paimon表test_paimon_student和test_paimon_data_type,插入数据,并使用Hive查询。
支持的数据类型
Hive对接Paimon支持的数据类型请参见表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”字段:

在Hive中使用以下命令查询数据,查询结果为空:
SELECT * FROM test_filter WHERE created_at BETWEEN '2024-01-02 00:00:00' AND '2024-01-05 23:59:59';

需要将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); 