代码之家  ›  专栏  ›  技术社区  ›  mcsilvio

在foreach中组织联接的最佳方式是什么?

  •  0
  • mcsilvio  · 技术社区  · 2 年前

    我有两张桌子: {users, orders} 在本例中,假设对于 users 表中,有100000个订单 orders 桌子

    我必须使用pyspark为每个用户生成一个Orders语句。因此,单个用户将需要他/她自己的订单列表。此外,我需要通过电子邮件(例如)将此声明发送给真实世界的用户。

    我的第一直觉是应用 DataFrame.foreach() 用户 数据帧。这样,我就可以依靠星火员工单独处理电子邮件发送。然而,我现在不知道获得每个用户订单的最佳方式。

    我将很快尝试以下(伪代码):

    users_df = <my entire users DataFrame>
    orders_df = <my entire orders DataFrame>
    
    #this is poorly named for max understandability in this context
    def foreach_function(row):
      user_id = row.user_id
      user_orders_df = orders_df.select(f'user_id = {user_id}')
    
      #here, I'd get any User info from 'row'
      #then, I'd convert all 'user_orders' to JSON
      #then, I'd prepare the email and send it
    
    users_df.foreach(foreach_function)
    

    我的理解是,如果我在 foreach 函数,在做这项工作时,我将利用Spark的可伸缩性。然而,我担心两件事:

    • 如果我提前接受所有订单。。。
      • 这样行吗?
      • 我会吃得太多吗?我会接受那些不会处理它们的分区上的订单吗(不同的用户)。
    • 如果我创建 orders_df (已过滤)在foreach函数中。。。
      • 它行得通吗?
      • 这对DB来说会不会太多IO?

    最终的问题是:我如何才能有效地实现这个目标?

    我还没有在这里尝试过任何东西。就在我们讲话的时候,我正在这样做,但我正遭受着选择麻痹症的折磨。

    求你了,谢谢你。

    0 回复  |  直到 2 年前