Hudi系列9:Flink SQL操作hudi表

一. 准备工作

-- 启动yarn-session
/home/flink-1.15.2/bin/yarn-session.sh -d
-- 在yarn session模式下启动flink sql
 /home/flink-1.15.2/bin/sql-client.sh embedded -s yarn-session

image.png

二. 插入数据

代码:

-- sets up the result mode to tableau to show the results directly in the CLI
set execution.result-mode=tableau;

CREATE TABLE t2(
  uuid VARCHAR(20) PRIMARY KEY NOT ENFORCED,
  name VARCHAR(10),
  age INT,
  ts TIMESTAMP(3),
  `partition` VARCHAR(20)
)
PARTITIONED BY (`partition`)
WITH (
  'connector' = 'hudi',
  'path' = 'hdfs://hp5:8020/user/hudi_data/t2',
  'table.type' = 'MERGE_ON_READ' -- this creates a MERGE_ON_READ table, by default is COPY_ON_WRITE
);

-- insert data using values
INSERT INTO t2 VALUES
  ('id1','Danny',23,TIMESTAMP '1970-01-01 00:00:01','par1'),
  ('id2','Stephen',33,TIMESTAMP '1970-01-01 00:00:02','par1'),
  ('id3','Julian',53,TIMESTAMP '1970-01-01 00:00:03','par2'),
  ('id4','Fabian',31,TIMESTAMP '1970-01-01 00:00:04','par2'),
  ('id5','Sophia',18,TIMESTAMP '1970-01-01 00:00:05','par3'),
  ('id6','Emma',20,TIMESTAMP '1970-01-01 00:00:06','par3'),
  ('id7','Bob',44,TIMESTAMP '1970-01-01 00:00:07','par4'),
  ('id8','Han',56,TIMESTAMP '1970-01-01 00:00:08','par4');

测试记录:
image.png

三. 查询数据

select * from t2;

image.png

四. 更新数据

更新数据和insert数据类似

-- this would update the record with key 'id1'
insert into t1 values
  ('id1','Danny',27,TIMESTAMP '1970-01-01 00:00:01','par1');

注意,现在保存模式是追加。通常,总是使用追加模式,除非您试图第一次创建表。再次查询数据将显示更新的记录。每个写操作都会生成一个由时间戳表示的新提交。在之前的提交中查找相同的_hoodie_record_keys的_hoodie_commit_time、age字段的更改。

测试记录:
image.png

五. 流查询

Hudi Flink还提供了获取自给定提交时间戳以来更改的记录流的功能。这可以通过使用Hudi的流查询和提供需要流化更改的起始时间来实现。如果我们希望在给定的提交之后进行所有更改(通常是这样),则不需要指定endTime。

CREATE TABLE t1(
  uuid VARCHAR(20) PRIMARY KEY NOT ENFORCED,
  name VARCHAR(10),
  age INT,
  ts TIMESTAMP(3),
  `partition` VARCHAR(20)
)
PARTITIONED BY (`partition`)
WITH (
  'connector' = 'hudi',
  'path' = '${path}',
  'table.type' = 'MERGE_ON_READ',
  'read.streaming.enabled' = 'true',  -- this option enable the streaming read
  'read.start-commit' = '20210316134557', -- specifies the start commit instant time
  'read.streaming.check-interval' = '4' -- specifies the check interval for finding new source commits, default 60s.
);

-- Then query the table in stream mode
select * from t1;

这将给出读取之后发生的所有更改。start-commit提交。该特性的独特之处在于,它现在允许您在流或批处理数据源上编写流管道.

六. 删除数据

在流查询中使用数据时,Hudi Flink源还可以接受来自底层数据源的更改日志,然后按行级应用UPDATE和DELETE。然后,您可以在Hudi上为各种RDBMS同步一个NEAR-REAL-TIME快照。

参考:

  1. https://hudi.apache.org/docs/0.12.0/flink-quick-start-guide
Apache Flink 是一个开源的流处理框架,用于处理实时数据流。Apache Hudi(Hadoop Upserts Deletes and Incremental Processing)是一个开源存储库,它允许以增量方式插入、删除和更新存储在Hadoop兼容存储系统中的大规模数据集。 在Flink中创建Hudi通常涉及以下步骤: 1. 配置Hudi数据源连接器:FlinkHudi集成通常需要配置相应的Hudi数据源连接器,它允许Flink作业与Hudi进行交互。 2. 定义模式:在创建Hudi之前,需要定义的模式,包括列名、数据类型等信息。 3. 指定参数:设置Hudi的参数,如类型(COPY_ON_WRITE或MERGE_ON_READ),存储路径,分区键等。 4. 创建:使用FlinkSQL API或者DataStream API创建Hudi。如果是SQL API,则使用`CREATE TABLE`语句,并指定使用Hudi连接器。 下面是一个创建Hudi的基本示例代码(使用的是Flink的DataStream API): ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 配置Hudi连接器选项 Properties properties = new Properties(); properties.setProperty("hoodie.datasource.write.storage.type", "COPY_ON_WRITE"); // 或者 "MERGE_ON_READ" properties.setProperty("hoodie.datasource.write.preCombineField", "ts"); // 如果需要,设置用于合并的字段 properties.setProperty("hoodie.datasource.write.recordkey.field", "id"); // 设置记录键字段 properties.setProperty("hoodie.datasource.write.partitionpath.field", "partition_key"); // 设置分区键字段 properties.setProperty("hoodie.datasource.write.table.name", "hudi_table"); // 设置Hudi名 properties.setProperty("hoodie.base.path", "hdfs://path/to/hudi/table"); // 设置Hudi的基础存储路径 // 创建数据源 FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>( "hudi_topic", // Kafka主题 new SimpleStringSchema(), // 序列化Schema properties); // 配置属性 DataStream<String> stream = env.addSource(consumer); // TODO: 将流中的数据转换为适当的格式,并执行数据写入操作Hudi中 env.execute("Flink Hudi Example"); ``` 注意:具体代码会根据使用的Flink版本、Hudi版本和具体需求有所不同。上述代码只作为一个简单示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值