我是Spark的初学者。我正在使用Pyspark将旧的Python代码转换为Spark。

我想得到一个与下面的代码等效的Pyspark

usersofinterest = actdataall[actdataall['ORDValue'].isin(orddata['ORDER_ID'].unique())]['User ID']
actdataallorddata都是Spark数据帧。

考虑到与之相关的缺点,我不想使用toPandas()函数。

任何帮助表示赞赏。

最佳答案

  • 如果两个数据框都很大,则应考虑使用内部联接,该联接将用作过滤器:

    首先,让我们创建一个数据框,其中包含我们要保留的顺序ID:

    orderid_df = orddata.select(orddata.ORDER_ID.alias("ORDValue")).distinct()
    

    现在,让我们将其与actdataall数据框一起加入:

    usersofinterest = actdataall.join(orderid_df, "ORDValue", "inner").select('User ID').distinct()
    
  • 如果您的订单ID的目标列表很小,则可以使用pyspark.sql isin函数(如Furianpandit帖子中所述),请不要忘记在使用变量之前广播变量(spark会将对象复制到执行任务的每个节点快很多):

    orderid_list = orddata.select('ORDER_ID').distinct().rdd.flatMap(lambda x:x).collect()[0]
    sc.broadcast(orderid_list)
    
  • 08-20 02:59