Spark:如何在不使用任何连接的情况下过滤行?
问题描述:
假设我有两个数据帧,df1和df2。 df1和df2包含“id”列。我想筛选DF1,使得产生的DF,df1prime,有Spark:如何在不使用任何连接的情况下过滤行?
- 只在DF1
- 没有在DF2找到的所有IDS发现的IDS,
不使用任何连接。我怎样才能做到这一点?回到RDDs而不是DFs会有帮助吗?欢迎pyspark和scala回应。
谢谢!
编辑:我想从DF1
答
保持整个行。如果你真的只需要在你的df1prime
(如你在你的问题状态),那么你可以简单地做(斯卡拉)的ID:
val df1primeIDs = df1.select($"id").except(df2.select($"id"))
如果需要的df1
整列,如果没有加入,我没有看到比任何其他选项(伴我行以上,并假设id
的类型为long):
val df1prime = df1.where($"id".isin(
df1primeIDs.collect().map(_.getLong(0)):_*)
)
但通常收集不是一个选项...
+0
啊我想仍然拥有df1中的所有列。收集将是非常昂贵的.. – tohweizhong
连接有什么问题?看到[这里](http://stackoverflow.com/questions/42351669/how-to-filter-duplicate-records-having-multiple-key-in-spark-dataframe/) – mtoto
连接没有什么特别的错误,但我会喜欢寻找一个更廉价的操作 – tohweizhong
如果你有数据框,反连接将是最便宜的操作,如果你想使用'rdd'你可以使用'cougroup()'然后过滤。 – mtoto