如何从单个通用类型Dataset拆分出多份不同类类型的Dataset
解决方案
核心使用Dataset原生的flatMap算子实现数组展开,全程不依赖DataFrame的explode方法,完全符合要求。
原有代码的错误点
- for循环遍历对象错误,应该遍历
add_marry数组而非General对象本身 flatMap要求返回可迭代集合,原有代码未覆盖空数组场景,也没有正确返回集合结构
正确实现代码
// 首先将源数据转为强类型General Dataset val dsHome: Dataset[General] = dfHome.as[General] // 生成Dataset[Mary] val dsMary: Dataset[Mary] = dsHome.flatMap { general => general.add_marry.map(addr => Mary(general.id, general.name, addr.streetUK, addr.houseUK)) } // 生成Dataset[John] val dsJohn: Dataset[John] = dsHome.flatMap { general => general.add_john.map(addr => John(general.id, general.name, addr.streetUS, addr.houseUS)) }
实现说明
flatMap算子会自动将每一条General数据返回的数组展开为多行,数组为空时对应行不会生成任何输出,自动适配空数组场景。最终输出结果和预期完全一致:
- 若原General行
add_marry有N个元素,就生成N条Mary数据 - 若原General行
add_john有M个元素,就生成M条John数据
全程仅使用Dataset强类型API,未调用任何DataFrame的explode相关方法,满足约束条件。
内容的提问来源于stack exchange,提问作者Henri Thorpe
相关产品推荐
相关产品推荐

