从Scala中的mutable.mutableList中删除记录

时间:2019-05-11 05:52:09

标签: scala apache-spark

我有一个具有以下结构的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来实现这一目标。

谢谢, 巴布

1 个答案:

答案 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上的工作方式也完全相同。