1. ホーム
  2. apache-spark

[解決済み] RDD/Spark DataFrameの特定の列に基づく行からの重複の除去

2023-05-17 18:47:53

質問

例えば、次のような形式のかなり大きなデータセットがあるとします。

data = sc.parallelize([('Foo',41,'US',3),
                       ('Foo',39,'UK',1),
                       ('Bar',57,'CA',2),
                       ('Bar',72,'CA',2),
                       ('Baz',22,'US',6),
                       ('Baz',36,'US',6)])

1列目、3列目、4列目の値のみに基づいて、重複する行を削除したいのですが、どうすればよいでしょうか?

完全に重複した行を削除するのは簡単です。

data = data.distinct()

で、5行目か6行目が削除されます。

しかし、列1、3、4のみに基づいて重複した行を削除するにはどうすればよいのでしょうか? つまり、どちらか一方を削除してください。

('Baz',22,'US',6)
('Baz',36,'US',6)

Pythonでは、これはカラムを .drop_duplicates() . Spark/Pysparkで同じことを実現するにはどうすればよいでしょうか?

どのように解決するのですか?

Pyspark を含む dropDuplicates() メソッドを含んでいます。これは 1.4 で導入されました。 https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame.dropDuplicates

>>> from pyspark.sql import Row
>>> df = sc.parallelize([ \
...     Row(name='Alice', age=5, height=80), \
...     Row(name='Alice', age=5, height=80), \
...     Row(name='Alice', age=10, height=80)]).toDF()
>>> df.dropDuplicates().show()
+---+------+-----+
|age|height| name|
+---+------+-----+
|  5|    80|Alice|
| 10|    80|Alice|
+---+------+-----+

>>> df.dropDuplicates(['name', 'height']).show()
+---+------+-----+
|age|height| name|
+---+------+-----+
|  5|    80|Alice|
+---+------+-----+