2014-09-18 12 views
11

Bir RDD olarak aşağıdaki tablo vardır:Nasıl yinelenen değerleri kaldırmak için bir RDD [PYSPARK]

Ben Value tüm çiftleri kaldırmak istediğiniz
Key Value 
1 y 
1 y 
1 y 
1 n 
1 n 
2 y 
2 n 
2 n 

.

Çıktı böyle gelmelidir: Ben nasıl uygulanacağını bilmiyorum

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

: pyspark çalışırken, çıktı böyle anahtar-değer çiftlerinin listesi olarak gelmelidir

Key Value 
1 y 
1 n 
2 y 
2 n 

Burada for döngü. Normal bir Python programında çok kolay olurdu.

Bunun için pyspark'da bazı işlevler var mı acaba?

+0

RDD için kısaltma nedir aka

? – user1767754

+0

Bir kümeye dönüştürebilirsiniz, sonra her şey yalnızca orada bir kez – user1767754

+0

Esnek Dağıtılmış Veri Kümesi. – COSTA

cevap

16

ben piton hakkında hiçbir bilgiye sahip korkuyorum, o yüzden bu yanıtında sağlayan tüm referanslar ve kod java göredir. Ancak, onu python koduna çevirmek çok zor olmamalıdır. Aşağıdaki webpage'a bir göz atmalısınız. Spark'un resmi web sayfasına yönlendirir; bu, Spark tarafından desteklenen tüm dönüştürmelerin ve eylemlerin bir listesini sağlar.

Yanılmıyorsam, en iyi yaklaşım (sizin durumunuzda), kaynak veri kümesinin (bağlantıdan alınan) farklı öğelerini içeren yeni bir veri kümesi döndüren distinct() dönüşümünü kullanmak olacaktır. Örneğin Yani

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 

dönüştürülür olsun misiniz: java, bu gibi bir şey olurdu Tabii

Partition 1: 

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

Partition 2: 

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

, hala olurdu birden RDD data Her birinin farklı öğelerin listesi vardır.

+1

dataset.distinct() problemi çözdü. Teşekkürler .. :) – COSTA

8

Bu sorun, Apache Spark'den pyspark kitaplığının distinct işleminin kullanılmasıyla kolayca çözülebilir.

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 

aşağıdaki çıktısı verir:

Output: [(u'1',u'y'),(u'1',u'n'),(u'2',u'y'),(u'2',u'n')] 
+0

yazım hatası ihtiyacı: 'allTuples' -> allTuplesRdd'? – Paul

+0

İyi catch @pavopax. Yazım hatası düzeltdim. – jsears

4

Belirli bir sütundan tüm çiftleri kaldırmak veya yani sütun setinde bir distinct yapıyor, sütunların ayarlamak istiyorsanız, o zaman pyspark işlevi vardır dropDuplicates, üzerinde belirgin olan belirli sütun kümesini kabul edecektir.

df.dropDuplicates(['value']).show() 
+1

Bu, rdd'yi önceden veri kümesine döndürmenizi gerektirir, bunu yalnızca rdd kullanarak nasıl yapabileceğimizi merak ediyorum – innovatism