Flink只插入指定字段到结果表

Flink SQL的Sink表只支持全字段数据插入,不支持指定字段数据插入和更新操作,那后面结果表增加字段如何处理?

首先我们需要给Sink指定主键,如果输出存储是声明了主键(primary key)的数据库(例如,RDS/ES/HBASE等),数据流的输出结果有以下2种情况:

  • 如果根据主键查询的数据在数据库中不存在,则会将该数据插入数据库。
  • 如果根据主键查询的数据在数据库中存在,则会根据主键更新数据。

这里跟mysql数据库的for update效果一样,所以我们可以使用这个特性进行分批次插入。解决了两个问题:

  1. 结果表有几百个甚至上千个字段的话,可以拆分成多个sql进行插入和更新数据。
  2. 结果表随着业务发展需要增加字段的话,可以根据此特性更新新字段的存量数据。

大SQL拆分

这里简单举个例子,我们的源数据表如下:

CREATE TABLE `user_source` (
  `user_id` string,
  `user_name` STRING,
  `mobile` STRING,
  `create_time` timestamp,
  `update_time` timestamp
) with (
    'connector' = 'mysql-cdc',
    'debezium.snapshot.locking.mode' = 'none',
    'hostname' = 'localhost&
### 关于 Hudi 和 Flink 的有效字段配置及使用方法 Hudi 是一种用于增量数据分析的开源框架,它提供了高效的更新、删除以及流式摄取功能。当与 Apache Flink 结合时,可以通过特定的字段配置来优化数据处理流程[^1]。 #### 配置项说明 以下是 Hudi-Flink 连接器中的常见字段及其作用: 1. **`hoodie.datasource.write.recordkey.field`** - 定义记录键(Record Key),通常对应数据库中的主键或唯一标识符。 - 如果未指定,则默认为空字符串 `""`,这可能导致写入失败或重复数据。 - 示例:如果中有 `id` 字段作为主键,则设置为 `"id"`。 2. **`hoodie.datasource.write.partitionpath.field`** - 指定分区字段,该字段决定数据如何被物理分组到不同目录下。 - 支持单个字段或多级分区路径定义。 - 示例:对于按日期分区的数据集,可设为 `"dt"` 或组合多个字段如 `"year,month,day"`[^1]。 3. **`hoodie.datasource.write.precombine.field`** - 当存在相同 Record Key 的多条记录时,此参数指定了优先使用的字段值。 - 常见情况下会选择时间戳字段或其他递增型字段以保留最新版本的数据。 - 示例:若每条记录都有 `ts` 时间戳字段,则应将其设定为 `"ts"`[^1]。 4. **`hoodie.datasource.write.table.name`** - 名,需确保全局唯一性以便区分不同的 Hudi 数据源实例。 - 此名称会被用来构建实际存储路径的一部分。 - 示例:假设目标名为 `orders_table`,则赋值为 `"orders_table"`。 5. **`hoodie.insert.shuffle.parallelism` 及其他性能调优选项** - 插入操作并行度控制,默认值可能不足以应对大规模生产环境需求。 - 用户可根据集群资源情况调整数值大小提升吞吐量现。 - 类似还有批量提交频率 (`hoodie.bulkinsert.sort.mode`) 等高级属性可供微调。 #### 使用示例代码 下面展示了一个简单的 Java/Scala 版本程序片段演示如何通过 SQL CLI 将结构化事件日志保存至 Hudi 中: ```java // 导入库声明省略... TableEnvironment tableEnv = ... ; // 初始化 Table API 环境对象 String[] fields = new String[]{"uuid", "name", "age", "gender"}; DataTypes[] types = Arrays.stream(fields).map(f -> DataTypes.STRING()).toArray(DataTypes[]::new); Schema schema = Schema.newBuilder().fields(Arrays.asList(Pair.of(fields, types))).build(); tableEnv.executeSql(""" CREATE TABLE IF NOT EXISTS users_hudi ( uuid STRING, name STRING, age INT, gender STRING, PRIMARY KEY (uuid) NOT ENFORCED ) WITH ( 'connector' = 'hudi', 'path' = '/data/hudi/users', 'write.precombine.field' = 'ts', -- 设置预合并字段 'hoodie.datasource.write.recordkey.field' = 'uuid' ) """); ``` #### 注意事项 - 在实际部署过程中需要注意兼容性问题,例如所选 Hudi bundle JAR 文件是否匹配当前运行环境中已安装好的具体版本号范围内的 Flink 构件集合。 - 对于实时应用场景而言,建议启用 Compaction 功能定期清理冗余的小文件从而改善长期维护成本效益比率[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值