PySpark中如何将多个同名列的取值合并为单个列?
重复列合并实现方案
核心能力为自动识别表内同名字段,将同名列每行取值合并为列表存入单列,以下是两种通用实现方式:
Python Pandas 实现(数据拉取后处理,适配所有数据库场景)
该方案不需要提前知道重名列的名称和数量,逻辑完全自动化:
- 先统计所有列名的出现频次,分离唯一列和重复列
- 对每个重复列名,按行聚合所有同名对应列的取值为列表
- 最终合并唯一列和聚合后的重名列得到结果
代码示例:
import pandas as pd def merge_dup_cols(df): col_freq = df.columns.value_counts() unique_cols = col_freq[col_freq == 1].index.tolist() dup_cols = col_freq[col_freq > 1].index.tolist() res = df[unique_cols].copy() for col in dup_cols: # 如需输出带括号的字符串格式,替换为下方注释代码 # res[col] = df[col].apply(lambda x: f"[{','.join(map(str, x))}]", axis=1) res[col] = df[col].apply(list, axis=1) return res # 测试示例 if __name__ == "__main__": # ages表测试 ages = pd.DataFrame([[25,1,2,3],[26,4,5,6]], columns=["age","ids","ids","ids"]) print(merge_dup_cols(ages)) # names表测试 names = pd.DataFrame([["abc","a","b"],["xyc","c","d"]], columns=["name","company","company"]) print(merge_dup_cols(names))
SQL 层面实现(拉取数据时直接处理)
如果是多表关联查询导致的列重名,可在查询时直接处理,注意SQL不支持返回同名字段,需要先给重名列加唯一别名再合并,MySQL示例如下:
SELECT age, CONCAT('[', ids_1, ',', ids_2, ',', ids_3, ']') AS ids FROM ( -- 关联查询时给同名列加别名区分 SELECT t1.age, t1.ids AS ids_1, t2.ids AS ids_2, t3.ids AS ids_3 FROM ages_t1 t1 LEFT JOIN ages_t2 t2 ON t1.age = t2.age LEFT JOIN ages_t3 t3 ON t1.age = t3.age ) tmp
内容的提问来源于stack exchange,提问作者emulator
相关产品推荐
相关产品推荐

