2017-04-13 46 views
0

我是新來的spark想要一些建議。我有一個RDD說carsrdd下面給出。手動將密鑰/索引分配給Spark中的RDD列(pyspark)

carsrdd=[(u'Ford Mustang', u'6', u'US', 18.0), (u'Mercury Capri 2000', u'4', u'US', 23.0), (u'Chevrolet Impala', u'8', u'US', 52.0)] 

我想相對於上carsrdd適用keyby()keys/columns/index但作爲默認我必須使用keys(0,1,2,3)以上RDD。 但我的問題是有辦法設置manual keys以上rdd像我想要使用keys如說(2,4,7,8)

是否可以爲RDD設置新的手動鍵?我想對這個問題提出建議。

注:我這樣爲了這個,我需要preserve的RDD的keys,用於與perserved keys RDD上執行進一步的操作這樣做是因爲我對RDD進一步縮小進行運算的系列的The RDD。

+0

Hey @mtoto,因爲我想在同一個rdd上執行'keyby()',後面跟'reducebykey()'的系列,這會導致每個'keyby()和reducebykey()'操作的rdd大小縮小,如同shriked rdd導致該rdd的鍵的變化,因此我必須再次更改鍵以在該rdd上執行'keyby()和reducebykey()'。 –

+0

keyby或reducebykey都不會更改您的rdd中的密鑰。請說明你的意思。 – mtoto

+0

嗨@mtoto,我已經在這裏詳細詢問了同樣的問題[保存rdd的密鑰](http://stackoverflow.com/questions/43276383/preserving-keysindex-of-an-rdd-in-pyspark) –

回答

0

默認情況下,索引總是從零開始。

但是,使用不同引用的一種方法是聲明字典的鍵爲[2,4,7,8],值爲[0,1,2,3],然後在keyBy中調用它。例如 。如果你想keyBy()與索引值7,

carsrdd=[(u'Ford Mustang', u'6', u'US', 18.0), (u'Mercury Capri 2000', u'4', u'US', 23.0), (u'Chevrolet Impala', u'8', u'US', 52.0)] 

dicto = {2:0,4:1,7:2,8:3} 

carsrdd_new = carsrdd.keyBy(lambda x : x[dicto[7]]) 
carsrdd_new.collect() 

輸出:

[(u'US', (u'Ford Mustang', u'6', u'US', 18.0)), 
(u'US', (u'Mercury Capri 2000', u'4', u'US', 23.0)), 
(u'US', (u'Chevrolet Impala', u'8', u'US', 52.0))] 
+0

會嘗試這個想法:) –

0

你可以使用zip,如果你事先知道你的索引

index = sc.parallelize([2,4,7,8]) 
keyedRdd = index.zip(carsrdd) 

這將創建一個像元組 -

[(2,(u'Ford Mustang', u'6', u'US', 18.0)), 
(4,(u'Mercury Capri 2000', u'4', u'US', 23.0)), 
(7,(u'Chevrolet Impala', u'8', u'US', 52.0))......]