Spark Dataset 2级深度汇总

时间:2018-11-25 15:44:14

标签: apache-spark apache-spark-sql apache-spark-dataset

哪个是最好的解决方案 在数据集上进行两级深度聚合?

让我更好地解释问题。

假设我们的用户属于一个或多个列表,而每个用户均由一个或多个合作伙伴提供。

我们希望在合并其合作伙伴的同一列表中删除重复的用户。

数据集约有十亿用户,千分之几

原始数据

user_id,list_id,partners
usr1 list1  [p1]                           
usr1 list1  [p1,p2]

详细数据

usr1 list1  [p1,p2]                        

解决方案1 ​​

  1. 使用用户名并将列表作为键将数据集转换为JavaPairRDD
  2. reduceByKey合并合作伙伴列表(无重复)
  3. 将元组映射到新记录

解决方案2

  1. 选择数据集爆炸性合作伙伴
  2. 通过user_id和list_id分组
  3. 在合作伙伴列上收集设置

    r.select(
                col("user_id"),
                col("list_id"),
                explode(col("partners"))
          .as("partners")
            )
     .groupBy("user_id","list_id")
     .agg(collect_set(col("partners")).as("partners")
    

这些解决方案有效,但是我怀疑我没有使用最佳的API说明。 减少整个数据集的应用程序考虑了每个user_id的关键,我认为这实际上是非常不平衡的,实际上每个用户创建了太多的分区,而我的性能很差。

我正在寻找一种解决方案,该解决方案首先是按列表聚合数据集,然后折叠相同的用户ID,最后将其合并为合作伙伴列表

有人可以帮我吗?

谢谢

0 个答案:

没有答案