在PySpark中按一个列中的不同值过滤行

25

假设我有以下表格:

+--------------------+--------------------+------+------------+--------------------+
|                host|                path|status|content_size|                time|
+--------------------+--------------------+------+------------+--------------------+
|js002.cc.utsunomi...|/shuttle/resource...|   404|           0|1995-08-01 00:07:...|
|    tia1.eskimo.com |/pub/winvn/releas...|   404|           0|1995-08-01 00:28:...|
|grimnet23.idirect...|/www/software/win...|   404|           0|1995-08-01 00:50:...|
|miriworld.its.uni...|/history/history.htm|   404|           0|1995-08-01 01:04:...|
|      ras38.srv.net |/elv/DELTA/uncons...|   404|           0|1995-08-01 01:05:...|
| cs1-06.leh.ptd.net |                    |   404|           0|1995-08-01 01:17:...|
|dialip-24.athenet...|/history/apollo/a...|   404|           0|1995-08-01 01:33:...|
|  h96-158.ccnet.com |/history/apollo/a...|   404|           0|1995-08-01 01:35:...|
|  h96-158.ccnet.com |/history/apollo/a...|   404|           0|1995-08-01 01:36:...|
|  h96-158.ccnet.com |/history/apollo/a...|   404|           0|1995-08-01 01:36:...|
|  h96-158.ccnet.com |/history/apollo/a...|   404|           0|1995-08-01 01:36:...|
|  h96-158.ccnet.com |/history/apollo/a...|   404|           0|1995-08-01 01:36:...|
|  h96-158.ccnet.com |/history/apollo/a...|   404|           0|1995-08-01 01:36:...|
|  h96-158.ccnet.com |/history/apollo/a...|   404|           0|1995-08-01 01:36:...|
|  h96-158.ccnet.com |/history/apollo/a...|   404|           0|1995-08-01 01:37:...|
|  h96-158.ccnet.com |/history/apollo/a...|   404|           0|1995-08-01 01:37:...|
|  h96-158.ccnet.com |/history/apollo/a...|   404|           0|1995-08-01 01:37:...|
|hsccs_gatorbox07....|/pub/winvn/releas...|   404|           0|1995-08-01 01:44:...|
|www-b2.proxy.aol....|/pub/winvn/readme...|   404|           0|1995-08-01 01:48:...|
|www-b2.proxy.aol....|/pub/winvn/releas...|   404|           0|1995-08-01 01:48:...|
+--------------------+--------------------+------+------------+--------------------+

我如何在PySpark中筛选出仅包含不同路径的表?但该表应包含所有列。

2个回答

39
如果您想要保存在特定列中所有值都不同的行,您需要在DataFrame上调用dropDuplicates方法。像我的示例中这样:
dataFrame = ... 
dataFrame.dropDuplicates(['path'])

其中path是列名称。


1
重复记录中,dropDuplicates如何决定删除哪条记录? - prudhvi Indana
1
@prudhviIndana 你无法调整这种行为。如果你需要这个功能,可能你应该使用其他查询,例如使用过滤器 / 分组 - likern
不是真的。请查看以下链接中的示例,了解如何在有序数据框中仅保留第一次出现的内容:https://dev59.com/sVkT5IYBdhLWcg3wX-dp#54738843 - Juergen

1
关于调整哪些记录保留和丢弃,如果您可以将条件编写成Window表达式,则可以使用类似于以下内容的内容。这是在Scala中(或多或少),但我想您也可以在PySpark中做到。
val window = Window.parititionBy('columns,'to,'make,'unique).orderBy('conditionToPutRowToKeepFirst)

dataframe.withColumn("row_number",row_number().over(window)).where('row_number===1).drop('row_number)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接