更新时间:2026-07-16 GMT+08:00
分享

使用Spark SQL操作Hudi表

操作场景

在MRS集群中,Hudi集成在Spark中,为数据处理提供了强大的支持。通过这种集成,用户不仅能够利用Spark SQL创建Hudi表,还能高效地执行对Hudi表的增、删、改、查等操作。Hudi表的设计特别适合于需要频繁更新和查询的场景,如实时数据分析、数据仓库更新等,它能够确保数据的一致性和高效性,同时支持增量数据处理,大大提高了数据处理的灵活性和性能。

具体来说,通过Spark SQL操作Hudi表的过程包括但不限于以下几个方面:

  • 创建Hudi表:用户可以使用Spark SQL的DDL(数据定义语言)语句来定义和创建Hudi表,指定表的结构、存储格式、索引类型等参数。
  • 插入数据:支持批量插入和追加数据,Hudi的写入优化技术能够确保高效的数据写入,同时减少数据冗余。
  • 更新和删除数据:Hudi支持基于主键的记录级更新和删除操作,这在传统的大数据处理框架中是难以实现的。通过Spark SQL,用户可以轻松执行这些操作,确保数据的准确性和时效性。
  • 查询数据:Hudi表支持高效的查询操作,包括点查询、范围查询和聚合查询等。通过优化的索引机制,Hudi能够快速定位和检索数据,提高查询性能。

前提条件

如果集群已开启Kerberos认证,需在Manager界面创建人机用户并关联到hadoop和hive用户组,主组为hadoop,具体操作请参考创建MRS集群用户

约束与限制

本章节适用于MRS 3.5.0-LTS及之后版本。

操作步骤

  1. 下载并安装Hudi客户端,具体请参考安装MRS客户端章节。

    Hudi集成在Spark组件中,从Manager页面下载集群完整客户端或者Spark组件的客户端即可,例如客户端安装目录为:“/opt/client”。

  2. 使用root用户登录客户端安装节点,执行如下命令:

    进入客户端目录:
    cd /opt/hadoopclient

    执行以下命令加载环境变量:

    source bigdata_env
    source Hudi/component_env

    如果集群已开启Kerberos认证,执行安全认证:

    kinit 创建的业务用户

    新创建的用户首次认证时需要修改密码,更改密码后重新执行kinit认证。

  3. 执行以下命令启动spark-sql。

    spark-sql --master yarn

  4. 执行如下SQL操作Hudi表:

    • 创建一个COW类型Hudi表:
      create table if not exists hudi_table2 (
          id int,
          name string,
          price double
      ) using hudi
      options (
          -- 指定Hudi表类型:COW写时复制表
          type = 'cow',
          -- 数据唯一主键,用于更新/删除数据
          primaryKey = 'id',
          -- 预合并字段,同主键多条数据按该字段值大小取最新记录
          preCombineField = 'price'
      );
      • type:表类型,可选cow、mor。如果选择mor表,则默认使用bucket索引,需要通过参数hoodie.bucket.index.num.buckets="xx"指定桶数。
      • primaryKey:Hudi 主键字段,多字段主键使用逗号分隔,建表后不可变更。
      • preCombineField:冲突合并字段,批量写入存在同一主键多条记录时,按此字段数值降序保留最新数据,一般推荐使用时间戳字段。
    • 插入数据:
      -- 向Hudi表插入第一条测试数据
      insertinto hudi_table2 select1,'1',1.0;
      -- 向Hudi表插入第二条测试数据
      insertinto hudi_table2 select2,'1',1.0;
    • 更新数据:
      -- 根据主键id更新指定记录,修改name字段值
      update hudi_table2 set name ='3'where id =1;
    • 删除数据:
      -- 根据主键id删除单条数据
      delete from hudi_table2 where id =2;
    • 查询数据:
      select * from hudi_table2;

相关文档

更多Hudi SQL语法请参考Hudi SQL语法参考

相关文档