一、如何在 mapPartitions 中释放资源mapPartitions是一种对每个分区进行操作的转换操作,于常用的map操作类似,但它处理的是整个分区而不是单个元素。mapPartitions的应用场景适合处理需要在每个分区内批量处理数据的场景,通常用于优化性能和减少计算开销。例如:减少数据库连接、网络连接等。即然涉及到资源的初始化那么必定伴随着资源的释放,这是本节讨论的重点。 以和 mysql 中数据交互为例,下面是一段伪代码 rdd.mapPartitions(iter => { // 初始化数据库连接 lazy val connection = initConnection(args) // 迭代数据 val result = iter.map(... /*处理逻辑会使用到 connection 对象*/) // 在返回结果之前需要释放资源 connection.close() // 返回处理结果 result}) 上面的代码在运行阶段之前都是没有问题的(可编译、可打包),不存在语法问题。但是在运行时会报No operations ...
一、问题复现不知你是否遇到过 join 结果明显不匹配的情况,例如on t1.join_key = t2.join_key中两个join_key明显不相等,但 join 的结果却将其匹配在一起。今日博主在通过用户 id 关联获取用户信息时发现一个用户 id 可以在用户维表中匹配出若干条(用户维表不存在数据重复),如下: -- 业务表create table tmp_hz_perm.tmp_20240520_1( id string) stored as parquet;-- 用户维度表create table tmp_hz_perm.tmp_20240520_2( id bigint, name string) stored as parquet; 插入若干条数据 insert into tmp_hz_perm.tmp_20240520_1values ('4268348961309240666');insert into tmp_hz_perm.tmp_20240520_2values (4268348961309240666, ' ...