【发布时间】:2019-02-28 19:15:29
【问题描述】:
我有一个三列表格[s,p,o]。我想删除行,对于 s 中的每个条目, p 列都不包含 [P625, P36] 值。例如
+----+----+------
| s| p| o |
+----+----+-----|
| Q31| P36| Q239|
| Q31|P625| 51|
| Q45| P36| Q597|
| Q45|P625| 123|
| Q51|P625| 22|
| Q24|P625| 56|
最终结果应该是
+----+----+------
| s| p| o |
+----+----+-----|
| Q31| P36| Q239|
| Q31|P625| 51|
| Q45| P36| Q597|
| Q45|P625| 123|
使用join操作,上面的任务很简单。
df.filter(df.p=='P625').join(df.filter(df.p=='P36'),'s')
但是有没有更优雅的方法来做到这一点?
【问题讨论】:
-
我没有用过这个技术,但是你可以看看它是否允许你做 df.filter(df.p=='P265' || df.p=='P36')你可能会在这里找到一些东西:stackoverflow.com/a/35882046/2793683
-
@pault 和 dmoore1181 两个建议的查询都不会删除给定示例中原始表的最后三行。
-
不是重复的,我不是针对同一行的不同列的
-
@user1848018 我明白你现在的意思了。我认为你必须在这种情况下加入。可能还有其他方法,但连接可能是最有效的。
-
join()也不会以您的最终结果示例结束。我认为您可能必须将p和o转换为单个列struct(),然后执行.groupBy()、.agg()、.filter(),然后执行.flatMap()以获得最终结果示例.
标签: sql apache-spark pyspark