Scala-Ids来自spark数据集的具有重复值的对象列表



我需要为所有具有相同(值和数量相同(参数的对象创建一个ID列表。我正在寻找一个比两个嵌套循环和if更高效的解决方案。
数据集中的对象结构:

case class MergedProduct(id: String,
products: List[Product])
case class Product(productUrl: String, productId: String)

数据集中的数据示例:

[  {
"id": "ID1",
"products": [
{
"product": {
"productUrl": "SOMEURL",
"productId": "1"
}
},
{
"product": {
"productUrl": "SOMEOTHERURL",
"productId": "1"
}
}
],
},
{
"id": "ID2",
"products": [
{
"product": {
"productUrl": "SOMEURL",
"productId": "1"
}
},
{
"product": {
"productUrl": "SOMEOTHERURL",
"productId": "1"
}
}
],
},
{
"id": "ID3",
"products": [
{
"product": {
"productUrl": "DIFFERENTURL",
"productId": "1"
}
},
{
"product": {
"productUrl": "SOMEOTHERURL",
"productId": "1"
}
}
],
},
{
"id": "ID4",
"products": [
{
"product": {
"productUrl": "SOMEOTHERURL",
"productId": "1"
}
},
{
"product": {
"productUrl": "DIFFERENTURL",
"productId": "1"
}
}
],
},
{
"id": "ID5",
"products": [
{
"product": {
"productUrl": "NOTDUPLICATEDURL",
"productId": "1"
}
},
{
"product": {
"productUrl": "DIFFERENTURL",
"productId": "1"
}
}
],
}
]

在这个例子中,我们有4个重复的对象,所以我想在相应的列表中获得它们的ID。

输出示例为List[List[String]]:List(List("ID1", "ID2"), List("ID3","ID4"))我正在寻找高效且可读的东西——我们谈论的数据集有近7亿个对象
因为我可以从数据集中删除列出的重复项(这不会影响数据库(,因为目标是一个-记录它们的存在,所以我在考虑一个接一个地获取MergedProduct的解决方案,搜索其他具有相同产品的MergedPproduct,获取它们的ID,登录它们的存在,然后从数据集中删除提到的MergedProduct ID,然后转到下一个,直到我检查整个数据集,但在这种情况下,我必须首先将其收集为MergedProjects的列表,然后进行所有操作-看起来像是绕过

在尝试了一些选项并寻找了简洁的解决方案后,我认为这是可以的:

private def getDuplicates(mergedProducts: List[MergedProduct]): List[List[String]] = {
val duplicates = mergedProducts.groupBy(_.products.sortBy(_.product.productId)).filter(_._2.size > 1).values.toList
duplicates.map(duplicates => duplicates.map(_.id))
}

最新更新