Pyspark Isin函数

add*_*787 5 apache-spark pyspark

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

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

usersofinterest = actdataall[actdataall['ORDValue'].isin(orddata['ORDER_ID'].unique())]['User ID']
Run Code Online (Sandbox Code Playgroud)

两者,actdataallorddata有星火dataframes。

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

任何帮助表示赞赏。

MaF*_*aFF 5

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

    首先,我们创建一个包含我们要保留的订单 ID 的数据框:

    orderid_df = orddata.select(orddata.ORDER_ID.alias("ORDValue")).distinct()
    
    Run Code Online (Sandbox Code Playgroud)

    现在让我们将其与 actdataall 数据框连接起来:

    usersofinterest = actdataall.join(orderid_df, "ORDValue", "inner").select('User ID').distinct()
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您的订单 ID 目标列表很小,那么您可以使用 Furianpandit 帖子中提到的 pyspark.sql isin 函数,不要忘记在使用变量之前广播您的变量(spark 会将对象复制到每个节点,从而使它们的任务变得很多快点):

    orderid_list = orddata.select('ORDER_ID').distinct().rdd.flatMap(lambda x:x).collect()[0]
    sc.broadcast(orderid_list)
    
    Run Code Online (Sandbox Code Playgroud)


小智 1

所以,你有两个 Spark 数据框。一个是actdataall,另一个是orddata,然后使用以下命令来获得您想要的结果。

usersofinterest  = actdataall.where(actdataall['ORDValue'].isin(orddata.select('ORDER_ID').distinct().rdd.flatMap(lambda x:x).collect()[0])).select('User ID')
Run Code Online (Sandbox Code Playgroud)