基于同名同数据类型列连接两表创建新表的技术方案问询
现有伪代码的问题
现有代码只完成了列名相同的筛选,完全没考虑数据类型匹配的要求,会把像示例里col3这种列名相同但类型不同的列错误纳入;而且最终join后的结果会包含原表的所有列,不符合表c只保留目标列的需求。
正确实现方案
要同时满足「列名相同+数据类型匹配」,还要最终只保留这些列,代码如下:
// 1. 找出列名相同且数据类型完全匹配的列 val validCommonCols = df1.schema.fields.filter { field1 => df2.schema.fields.exists { field2 => field1.name == field2.name && field1.dataType == field2.dataType } }.map(_.name).toList // 2. 基于有效列做inner join,确保行数据匹配 val joinedDf = df1.join(df2, validCommonCols, "inner") // 3. 只保留目标列,得到最终的表c val dfC = joinedDf.select(validCommonCols.map(col): _*)
代码说明
- 第一步遍历df1的schema,同时检查df2中是否存在同名且同类型的字段,精准筛选出符合要求的列
- 第二步用inner join确保只有两边这些列数据完全匹配的行才会被保留
- 第三步通过select只保留目标列,完全符合表c的结构要求
用示例数据测试的话,最终dfC的结构就是只包含col1(int)和col2(string),数据也只有5 | ABC这一行,完全符合预期。
内容的提问来源于stack exchange,提问作者Sumi
相关产品推荐
相关产品推荐

