优化火花加入:如何执行多个左连接而无需其他改组 llet说我有一个2个数据范围: 首先是有3列的门票: account_id 受让人_id requester_id 而且我有第二列的第二个数据帧用户: account_id ID 姓名 我想要...

问题描述 投票:0回答:0

account_id

  • assignee_id
    
    
  • requester_id
    
    
  • 我有第二个dataframe
    users
    带3列:

account_id

  • id
    
    
  • name
    
    
  • 我希望作为输出单个数据框:
  • account_id

    assignee_id
  • assignee_name
  • requester_id
  • requester_name
  • 
    ticket的受让人和请求者都是用户的实例。因此,基本上我的初始代码是:
  • tickets .as("ticket") .join( users.as("assignee"), $"ticket.account_id" === $"assignee.account_id" && "ticket.assignee_id" === "assignee.id", "left_outer" ) .join( users.as("requester"), $"ticket.account_id" === $"requester.account_id" && $"ticket.requester_id" === $"requester.id", "left_outer" ) .select( $"tickets.*", $"assignee.name".as("assignee_name"), $"requester.name".as("requester_name") )
    这结果是一个计划,我将我洗牌和
  • tickets
数据两次,一次是第一次加入,第二次加入第二次加入(预期)。

现在我想知道是否有某种明智的方法可以避免这种双重混乱。

我的某些抽象想法是以某种方式分区的门票,并实现了播放每个用户(例如user.id.id.id均等于aptionee_id或requester_id),它已发送到票务分区(单个用户可能会发送到多个用户分区)然后在本地,在每个分区中,我们将执行两个左连接。 这样,我们只需将每个数据框架供电一次,然后我们将数据不合同。
我对这个问题的思考越多,我认为这是可能的越少,而不会在Spark自定义逻辑上太深(理想情况下,可以使用Spark DataFrame API实现这一目标)。
我相信该解决方案必须带上自定义分区器,因为HashPartitioner无法在此处工作,因为如果使用thectite canterate(Hash函数不分配),我们将无法推导给定用户的分区ID )。另一方面,从我看到的分区者映射到1行到1个分区,如前所述,我想在必要时将一个用户发送到多个分区。

如果您认为这是一个不可能的问题,那就告诉我,我对此很好。 我将继续搜索,我只是发现这是一个有趣的优化主题。

	
没有更好的方法是更好的。
您的状态广播不是一个选择。

对共同属性(例如在遗愿中)进行重新分配也涉及改组。

我在过去注意到,由于实施催化剂,其他一些情况不必要地发生了。

apache-spark optimization partitioning denormalization
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.