我有一个具有以下结构的mutable.MutableList [emp]。
case class emp(name: String,id:String,sal: Long,dept: String)
我正在下面的mutable.MutableList [emp]中基于上述案例类生成记录。
val list1: mutable.MutableList[emp] = ((mike, 1, 123, HR),(mike,2,123,sys),(Lind,1,2323,sys))
如果我的名字分别是ID 1和2,那么我只需要取2并删除ID 1记录。 ID ID 2不存在,我必须输入ID1。
如何实现这一目标?我用以下方法尝试过,但结果不准确:
0. converted mutable.mutableList to Dataframe
1. filtered records with id 1(id1s_DF)
2. filtered records with id 2(other_rec_DF)
3. joined records with name and used leftsemi as join condition.
val join_info_DF = other_rec_DF.join(id1s_DF, id1s_DF("name") =!= other_rec_DF("name"),"leftsemi")
以上连接将给出在other_rec_DS中存在但在Other_rec_DF中不存在的所有名称。
好像我在联接上做错了一些事情,没有得到预期的结果。
请帮助我在mutableList中或将其转换为Dataframe来实现这一目标。
谢谢, 巴布
答案 0 :(得分:3)
如果数据大小足够小,则不需要Apache Spark这样的任务即可完成
用普通的scala代码执行此操作,代码如下所示
case class Emp(name: String,id:Int,sal: Long,dept: String)
val list1: mutable.MutableList[Emp] = mutable.MutableList(
Emp("mike", 1, 123, "HR"),
Emp("mike", 2, 123, "sys"),
Emp("Lind", 1, 2323, "sys")
)
val result = list1
.groupBy(_.name)
.mapValues(_.sortBy(_.id)(Ordering[Int].reverse).head)
.values
result.foreach(println)
以上代码的输出为
Emp(Lind,1,2323,sys)
Emp(mike,2,123,sys)
想法/方法是确保我们将要删除重复项的键分组,对它们进行排序并选择ID最高的项。然后,我们放下键并仅存储值。
上述方法在Spark上的工作方式也完全相同。