account_id
assignee_id
requester_id
users
带3列:account_id
id
name
account_id
assignee_id
assignee_name
requester_id
requester_name
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个分区,如前所述,我想在必要时将一个用户发送到多个分区。
如果您认为这是一个不可能的问题,那就告诉我,我对此很好。 我将继续搜索,我只是发现这是一个有趣的优化主题。
没有更好的方法是更好的。您的状态广播不是一个选择。 对共同属性(例如在遗愿中)进行重新分配也涉及改组。
我在过去注意到,由于实施催化剂,其他一些情况不必要地发生了。