gpt4 book ai didi

scala - Spark Dataframe Join - 重复列(非连接列)

转载 作者:行者123 更新时间:2023-12-02 06:49:34 28 4
gpt4 key购买 nike

我有两个具有以下架构的数据框 df1(员工表)和 df2(部门表):

df1.columns
// Arrays(id,name,dept_id)

df2.columns
// Array(id,name)

在我加入 df1.dept_id 和 df2.id 上的这两个表之后:

val joinedData = df1.join(df2,df1("dept_id")===df2("id"))
joinedData.columns
// Array(id,name,dept_id,id,name)

保存在文件中时,

joined.write.csv("<path>")

它给出错误:

 org.apache.spark.sql.AnalysisException: Duplicate column(s) : "name", "id" found, cannot save to file.;

我读到过有关使用字符串序列来避免列重复的信息,但那是针对要执行连接的列。我需要为非连接列提供类似的功能。

有没有一种直接的方法可以将重复列的表名嵌入以便保存?

我想出了一个解决方案,即匹配两个 dfs 的列并重命名重复的列以将表名附加到列名。但是有直接的方法吗?

注意:这将是一个通用代码,仅包含执行连接的列详细信息。其余列仅在运行时已知。所以我们不能通过硬编码来重命名列。

最佳答案

我会通过确保它们具有不同的名称来保留所有列,例如通过在列名前添加标识符:

val df1Cols = df1.columns
val df2Cols = df2.columns

// prefixes to column names
val df1pf = df1.select(df1Cols.map(n => col(n).as("df1_"+n)):_*)
val df2pf = df2.select(df2Cols.map(n => col(n).as("df2_"+n)):_*)

df1pf.join(df2pf,
$"df1_dept_id"===$"df2_id",
)

关于scala - Spark Dataframe Join - 重复列(非连接列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48296677/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com