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
にいくつかの関数があるのだろうか。
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データセットがあり、それぞれが個別の要素のリストを持っています。
この問題は、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')]
特定の列または列のセットからすべての重複を削除する場合、つまり列のセットに対してdistinct
を実行する場合、pysparkには関数dropDuplicates
があり、特定の列のセットを受け入れます明確に。
aka
df.dropDuplicates(['value']).show()