web-dev-qa-db-ja.com

RDDから重複する値を削除する方法[PYSPARK]

RDDとして次の表があります。

Key Value
1    y
1    y
1    y
1    n
1    n
2    y
2    n
2    n

Valueから重複をすべて削除したい。

出力は次のようになります。

Key Value
1    y
1    n
2    y
2    n

Pysparkでの作業中、出力は次のようなキーと値のペアのリストとして表示されます。

[(u'1',u'n'),(u'2',u'n')]

ここでforループを適用する方法がわかりません。通常のPythonプログラムでは、非常に簡単だったでしょう。

同じことのためにpysparkにいくつかの関数があるのだろうか。

14
Prince Bhatti

pythonについての知識がないため、この回答で提供するすべての参照とコードはJavaに関連しています。ただし、pythonコードに変換することはそれほど難しくありません。

次の webpage をご覧ください。 Sparkの公式Webページにリダイレクトされ、Sparkによってサポートされるすべての変換とアクションのリストが提供されます。

私が間違っていない場合、(あなたの場合)最良のアプローチはdistinct()変換を使用することです。これは、ソースデータセットの個別の要素を含む新しいデータセットを返します(リンクから取得)。 Javaでは、次のようになります。

JavaPairRDD<Integer,String> myDataSet = //already obtained somewhere else
JavaPairRDD<Integer,String> distinctSet = myDataSet.distinct();

そのため、たとえば:

Partition 1:

1-y | 1-y | 1-y | 2-y
2-y | 2-n | 1-n | 1-n

Partition 2:

2-g | 1-y | 2-y | 2-n
1-y | 2-n | 1-n | 1-n

次のように変換されます:

Partition 1:

1-y | 2-y
1-n | 2-n 

Partition 2:

1-y | 2-g | 2-y
1-n | 2-n |

もちろん、複数のRDDデータセットがあり、それぞれが個別の要素のリストを持っています。

18
Mikel Urkia

この問題は、Apache Sparkのpysparkライブラリのdistinct操作を使用して簡単に解決できます。

from pyspark import SparkContext, SparkConf

# Set up a SparkContext for local testing
if __name__ == "__main__":
    sc = SparkContext(appName="distinctTuples", conf=SparkConf().set("spark.driver.Host", "localhost"))

# Define the dataset
dataset = [(u'1',u'y'),(u'1',u'y'),(u'1',u'y'),(u'1',u'n'),(u'1',u'n'),(u'2',u'y'),(u'2',u'n'),(u'2',u'n')]

# Parallelize and partition the dataset 
# so that the partitions can be operated
# upon via multiple worker processes.
allTuplesRdd = sc.parallelize(dataset, 4)

# Filter out duplicates
distinctTuplesRdd = allTuplesRdd.distinct() 

# Merge the results from all of the workers
# into the driver process.
distinctTuples = distinctTuplesRdd.collect()

print 'Output: %s' % distinctTuples

これは以下を出力します:

Output: [(u'1',u'y'),(u'1',u'n'),(u'2',u'y'),(u'2',u'n')]
8
jsears

特定の列または列のセットからすべての重複を削除する場合、つまり列のセットに対してdistinctを実行する場合、pysparkには関数dropDuplicatesがあり、特定の列のセットを受け入れます明確に。

aka

df.dropDuplicates(['value']).show()
4
captClueless