更新时间:2026-06-11 GMT+08:00
分享

配置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_studenttest_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;
        图1 Paimon表join Paimon表查询操作
      3. Paimon表union/union all Paimon表:
        select * from test_paimon_student a union all select * from test_paimon_student b;
        图2 union/union all查询
      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;
        图3 Paimon表join Hive表查询
      5. 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表查询
    • 表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 添加字段并插入数据
      3. 退出Spark客户端。
      4. 使用Hive查询Schema变更后的Paimon表。

        登录Hive客户端:

        beeline
        查询Paimon表:
        select * from test_paimon_student;
        图6 使用Hive查询Paimon表
    • Paimon表属性查询:
      登录Hive客户端:
      beeline

      查询Paimon表属性:

      desc formatted test_paimon_student;

      例如,命令执行后,可查看“storage_handler”是否为“org.apache.paimon.hive.PaimonStorageHandler”。

支持的数据类型

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”字段:

在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);

相关文档