Hudi 的写操作类型

14 篇文章 1 订阅

简介

本文旨在介绍 Hudi 的各种写操作,以便在使用中作出更好的选择。

写操作的类型

1. UPSERT

这是默认的写操作类型,通过查找索引,输入的数据会被打上 insert 或者 update 的标签。推荐在数据库变更捕获的场景使用,通常这类场景会包含更新的记录。使用 UPSERT 操作类型写入的目标的表不会存在重复的数据。

2. INSERT

这种操作与 UPSERT 操作非常类似,只是跳过了查找索引这一步,使得它在性能上要比 UPSERT 要快很多。如果只是需要 Hudi 的事务写/增量拉取数据/存储管理的能力,并且可以容忍重复数据,那么可以选择 INSERT 操作。

3. BULK_INSERT

UPSERT 和 INSERT 操作都把输入的数据先在内存中缓存起来以提高性能,但是对于首次初始化导入数据到 Hudi 表会显得有点笨重。BULK_INSERT 提供了与 INSERT 类似的机制,不同的时候实现了对排序数据的写算法,可以快速的完成几百TB数据的初始化加载。

4. DELETE

Hudi 支持两种方式的 DELETE操作:

  • Soft Deletes: 保留record key, 把其他所有的字段的值都置为 NULL。
  • Hard Deletes: 从物理上删除这条记录。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Java中使用Hudi的Spark客户端创建Hudi表并入数据,你可以按照以下步骤进行操作: 1. 首先,确保你已经在项目中添加了Hudi和Spark依赖。你可以在pom.xml文件中添加以下依赖项: ```xml <dependencies> <!-- Hudi --> <dependency> <groupId>org.apache.hudi</groupId> <artifactId>hudi-spark-bundle_2.12</artifactId> <version>0.9.0</version> </dependency> <!-- Spark --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.1.1</version> </dependency> </dependencies> ``` 2. 在Java中创建SparkSession对象: ```java import org.apache.spark.sql.SparkSession; SparkSession spark = SparkSession.builder() .appName("HudiExample") .master("local[*]") // 根据实际运行环境设置 .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") .getOrCreate(); ``` 3. 创建Hudi表,指定表名、表类型(如COPY_ON_WRITE或MERGE_ON_READ)、键名和分区列: ```java import org.apache.hudi.DataSourceWriteOptions; import org.apache.hudi.HoodieDataSourceHelpers; import org.apache.hudi.config.HoodieWriteConfig; String tableName = "my_hudi_table"; String basePath = "/path/to/hudi_table"; String primaryKey = "id"; String partitionColumn = "date"; HoodieWriteConfig writeConfig = HoodieWriteConfig.newBuilder().withPath(basePath) .withSchema(HoodieDataSourceHelpers.createHoodieWriteSchema(schema)) // 设置数据模式 .withParallelism(2, 2) // 设置并行度 .forTable(tableName) .withIndexConfig(HoodieIndexConfig.newBuilder().withIndexType(HoodieIndex.IndexType.BLOOM).build()) // 设置索引类型为Bloom .withCompactionConfig(HoodieCompactionConfig.newBuilder().archiveCommitsWith(30, TimeUnit.SECONDS).build()) // 设置30s内自动归档 .build(); HoodieSparkEngineContext context = new HoodieSparkEngineContext(spark.sparkContext()); HoodieTableMetaClient metaClient = HoodieTableMetaClient.builder().setConf(spark.sparkContext().hadoopConfiguration()) .setBasePath(basePath) .setLoadActiveTimelineOnLoad(true) .build(); HoodieTable table = HoodieSparkTable.create(writeConfig, context, metaClient); ``` 4. 将数据Hudi表: ```java import org.apache.hudi.common.model.HoodieRecord; // 创建要入的数据集 List<HoodieRecord> records = Arrays.asList( new HoodieRecord(new HoodieKey("1", "2021-01-01"), data1), new HoodieRecord(new HoodieKey("2", "2021-01-02"), data2), new HoodieRecord(new HoodieKey("3", "2021-01-03"), data3) ); JavaRDD<HoodieRecord> recordRDD = JavaSparkContext.fromSparkContext(spark.sparkContext()).parallelize(records); String commitTime = HoodieTestUtils.makeNewCommitTime(); HoodieWriteClient<HoodieRecord> writeClient = new HoodieWriteClient<>(context, writeConfig); writeClient.startCommit(commitTime); writeClient.insert(recordRDD, commitTime); writeClient.commit(commitTime, recordRDD); ``` 以上是使用Hudi Spark客户端在Java中创建Hudi表并入数据的基本步骤。请根据你的实际情况进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修破立生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值