Scala - 如果 DF1 中的数据与 DF2 中的列匹配,则从 DF1 中删除记录 [重复]
Posted
技术标签:
【中文标题】Scala - 如果 DF1 中的数据与 DF2 中的列匹配,则从 DF1 中删除记录 [重复]【英文标题】:Scala - Drop records from DF1 if it has matching data with column from DF2 [duplicate] 【发布时间】:2018-05-03 10:53:35 【问题描述】:我有两个 DF(railroadGreaterFile
,railroadInputFile
)。
如果railroadGreaterFile
中的MEMBER_NUM
列中的数据与railroadInputFile
中MEMBER_NUM
列中的数据匹配,我想从railroadGreaterFile
中删除记录
以下是我使用的:
val columnrailroadInputFile = railroadInputFile.withColumn("check", lit("check"))
val railroadGreaterNotInput = railroadGreaterFile
.join(columnrailroadInputFile, Seq("MEMBER_NUM"), "left")
.filter($"check".isNull)
.drop($"check")
执行上述操作,记录被删除,但是我看到railroadGreaterNotInput
的架构是我的DF1
和DF2
的组合,所以当我尝试将railroadGreaterNotInput
的数据写入文件时,它给了我下面错误
org.apache.spark.sql.AnalysisException: Reference 'GROUP_NUM' is ambiguous, could be: GROUP_NUM#508, GROUP_NUM#72
我应该怎么做才能使railroadGreaterNotInput
只包含来自railroadGreaterFile
DF 的字段?
【问题讨论】:
您可以从 railroadInputFile 重命名冲突的列名,并且只有在加入它们后才选择 railroadGreaterFile 数据框列 【参考方案1】:加入时只能选择MEMBER_NUM
val columnrailroadInputFile = railroadInputFile.withColumn("check", lit("check"))
val railroadGreaterNotInput = railroadGreaterFile.join(
columnrailroadInputFile.select("MEMBER_NUM", "check"), Seq("MEMBER_NUM"), "left")
.filter($"check".isNull).drop($"check")
或将columnrailroadInputFile
中的所有列删除为
columnrailroadInputFile.drop(columnrailroadInputFile.columns :_*)
但是对于这个使用join contition as
columnrailroadInputFile("MEMBER_NUM") === railroadInputFile("MEMBER_NUM")
希望这会有所帮助!
【讨论】:
我快到了,现在我的第一列是 MEMBER_NUM,然后是其余列,有没有办法可以交换 railroadGreaterNotInput 中的第一列和第二列? 我不确定,交换第一列和第二列是什么意思。 railroadInputFile 的架构是 GROUP_NUM, MEMBER_NUM, .... railroadGreaterFile 的架构是 GROUP_NUM, MEMBER_NUM, .... 最终的 DF railroadGreaterNotInput 的 Schema 显示 MEMBER_NUM, GROUP_NUM.... 我想要最终的 DF与我的 DF1 和 DF2 同步。 你想交换GROUP_NUM
和 MEMBER_NUM
吗?为什么要这样做?
你只需要使用 select("fields in order ")以上是关于Scala - 如果 DF1 中的数据与 DF2 中的列匹配,则从 DF1 中删除记录 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
spark:合并两个数据帧,如果两个数据帧中的ID重复,则df1中的行覆盖df2中的行
Spark SCALA - 连接两个数据帧,其中一个数据帧中的连接值位于第二个数据帧中的两个字段之间
如果一对列值未在另一个 df2 中配对,则删除 df1 中的行