2016-02-29 100 views
3
  1. 有效的鍵值對如果我有一個RDD,我該如何理解這些數據是關鍵:值 格式?有沒有找到相同的方法 - 類似 類型(對象)告訴我一個對象的類型。我試過print type(rdd.take(1)),但它只是說<type 'list'>
  2. 比方說,我有一個數據,如(x,1),(x,2),(y,1),(y,3),我使用 groupByKey並得到(x,(1,2)),(y,(1,3))。有沒有辦法將x和y是鍵的值定義爲 (1,2)(1,3)?或者一個密鑰必須是單個值?我注意到,如果我使用reduceByKeysum函數來獲取((x,3),(y,4))則變得更容易定義這個數據作爲鍵值對
+0

1.'rdd.first()' 2.請澄清。 'groupByKey'通常用於你最終需要整個列表的情況。 –

+0

1.不會'rdd.first()'返回我只是第一個數據點?我想知道數據是否是鍵值格式。 2.是的,我用'groupByKey'來獲取整個數據,但是我想用鍵值格式 – user2543622

+0

你想把它作爲地圖嗎?那麼collectAsMap呢? 首先你會得到一個元組,你是什麼意思的鍵值格式?你期望什麼樣的類型? –

回答

1

Python是一種動態類型語言和PySpark不使用任何特殊的數據鍵入鍵值對。爲一個對象的唯一要求被認爲有效的數據爲PairRDD操作是,它可以如下解壓縮:

k, v = kv 

通常你可以使用一個兩個元件tuple由於其語義(固定大小的不可變的對象),並類似於Scala Product類。但是,這僅僅是一個慣例,沒有什麼阻止你是這樣的:

key_value.py

class KeyValue(object): 
    def __init__(self, k, v): 
     self.k = k 
     self.v = v 
    def __iter__(self): 
     for x in [self.k, self.v]: 
      yield x 
from key_value import KeyValue 

rdd = sc.parallelize(
    [KeyValue("foo", 1), KeyValue("foo", 2), KeyValue("bar", 0)]) 

rdd.reduceByKey(add).collect() 
## [('bar', 0), ('foo', 3)] 

,並任意類表現得像一個鍵值。所以再一次,如果某件東西能夠正確解包爲一對對象,那麼它是一個有效的鍵值。實施__len____getitem__魔術方法也應該起作用。可能最優雅的處理方法是使用namedtuples

type(rdd.take(1))返回list長度n所以它的類型將永遠是相同的。

+0

我正在向您學習。但是我仍然對某件事感到困惑。無論出於什麼原因,我使用'groupByKey',我會得到'[('bar',(0)),('foo',(1,2))]'...現在我可以使用' rdd.map(lambda x:(x [0],len(x [1]))'?我知道使用'countByKey'也可以做同樣的事情,但我想使用'groupByKey' – user2543622

+0

'(0)'不是一個有效的'tuple'字面值。它只是'0'。否則就是這樣。 – zero323