Scala Spark:如何在不使用任何联接的情况下筛选行?

Scala Spark:如何在不使用任何联接的情况下筛选行?,scala,apache-spark,spark-dataframe,pyspark-sql,Scala,Apache Spark,Spark Dataframe,Pyspark Sql,假设我有两个数据帧,df1和df2。df1和df2都包含“id”列。我想过滤df1,这样生成的df,df1prime,具有 只有在df1中找到的ID 在df2中找不到任何ID 不使用任何联接。我该怎么做?返回RDDs而不是DFs会有帮助吗?pyspark和scala的回应都是受欢迎的 谢谢 编辑:我想保留df1的整行,如果您真的只想在df1prime中使用ID(如您在问题中所述),那么您只需执行(scala): 如果您需要整列的df1,而不需要连接,我看不到任何其他选项(使用上面的行并假设i

假设我有两个数据帧,df1df2df1df2都包含“id”列。我想过滤df1,这样生成的df,df1prime,具有

  • 只有在df1中找到的ID
  • df2中找不到任何ID
不使用任何联接。我该怎么做?返回RDDs而不是DFs会有帮助吗?pyspark和scala的回应都是受欢迎的

谢谢


编辑:我想保留df1的整行,如果您真的只想在
df1prime
中使用ID(如您在问题中所述),那么您只需执行(scala):

如果您需要整列的
df1
,而不需要连接,我看不到任何其他选项(使用上面的行并假设
id
的类型为long):


但通常情况下,集合不是选项…

联接有什么问题?看不出连接有什么特别的错误,但我想寻找一种更便宜的操作如果你有数据帧,反连接将是最便宜的操作,如果你想使用
rdd
,你可以使用
cougroup()
,然后过滤。对不起,这怎么可能是重复的?根据你的描述,你正试图实现完全相同的目标。如果不是这样,请共享示例数据和预期输出,以及您尝试过的代码。如果是这样的话,正如前面提到的,你不会找到比反连接更有效的解决方案,除非df2足够小,可以将其用作广播变量。收集将非常昂贵。。
val df1primeIDs = df1.select($"id").except(df2.select($"id"))
val df1prime = df1.where($"id".isin(
   df1primeIDs.collect().map(_.getLong(0)):_*)
 )