我有这样的SparkDataFrame:
+---+-----+------+----+------------+------------+
| ID| ID2|Number|Name|Opening_Hour|Closing_Hour|
+---+-----+------+----+------------+------------+
|ALT| QWA| 6|null| 08:59:00| 23:30:00|
|ALT|AUTRE| 2|null| 08:58:00| 23:29:00|
|TDR| QWA| 3|null| 08:57:00| 23:28:00|
|ALT| TEST| 4|null| 08:56:00| 23:27:00|
|ALT| QWA| 6|null| 08:55:00| 23:26:00|
|ALT| QWA| 2|null| 08:54:00| 23:25:00|
|ALT| QWA| 2|null| 08:53:00| 23:24:00|
+---+-----+------+----+------------+------------+
我想获得一个新的 Dataframe ,其中只有关于3个字段"ID"
、"ID2"
和"Number"
的非唯一行。
这意味着我想要这个DataFrame:
+---+-----+------+----+------------+------------+
| ID| ID2|Number|Name|Opening_Hour|Closing_Hour|
+---+-----+------+----+------------+------------+
|ALT| QWA| 6|null| 08:59:00| 23:30:00|
|ALT| QWA| 2|null| 08:53:00| 23:24:00|
+---+-----+------+----+------------+------------+
或者可能是一个包含所有副本的 Dataframe :
+---+-----+------+----+------------+------------+
| ID| ID2|Number|Name|Opening_Hour|Closing_Hour|
+---+-----+------+----+------------+------------+
|ALT| QWA| 6|null| 08:59:00| 23:30:00|
|ALT| QWA| 6|null| 08:55:00| 23:26:00|
|ALT| QWA| 2|null| 08:54:00| 23:25:00|
|ALT| QWA| 2|null| 08:53:00| 23:24:00|
+---+-----+------+----+------------+------------+
3条答案
按热度按时间5us2dqdw1#
一种方法是使用
pyspark.sql.Window
添加一个列,该列计算每行的("ID", "ID2", "Number")
组合的重复项数。然后,只选择重复项数大于1的行。我使用
pyspark.sql.functions.count()
来计算每个组中的项数,这将返回一个包含所有重复项的DataFrame(显示的第二个输出)。如果您希望每个
("ID", "ID2", "Number")
组合仅获得一行,则可以使用另一个窗口对行进行排序。例如,在下面,我为
row_number
添加了另一列,并仅选择重复计数大于1且行号等于1的行。这保证了每个分组一行。yduiuuwa2#
下面是一个不使用Window的方法。
具有重复项的DataFrame
具有所有重复项的DataFrame(使用left_anti联接)
pgccezyw3#
要在pault的really great answer上扩展:我经常需要将一个 Dataframe 划分为只包含重复x次的条目的子集,由于我经常需要这样做,所以我将其转换为一个函数,在脚本的开头,我将其与许多其他辅助函数一起导入: