2014-11-24 94 views
-1

使用如果我有以下元組:星火:鮮明的

((aaa,1,2),(sss,3,4)) 
((bbb,2,3),(aaa,1,2)) 
((bbb,2,3),(sss,3,4)) 
((bbb,2,3),(aaa,4,5)) 
((aaa,4,5),(sss,3,4)) 

是否有可能使用不同的()?的第一個元素的元組

((aaa,1,2),(sss,3,4)) 
((bbb,2,3),(aaa,1,2)) 
((bbb,2,3),(sss,3,4)) 
+1

目前還不清楚你想要輸出什麼。你想在輸出中的第一個內部元組的第一個元素和整個第二個內部元組的每個組合的一個元素? – 2014-11-24 09:27:09

+0

是的,你是對的 – lantis 2014-11-24 10:34:55

+0

你可以更具體地瞭解用於過濾元組的邏輯並在你試圖接近它的方法上添加一些(僞)代碼嗎?提供的答案與預期輸出不符,但尚不清楚問題出在哪裏。 – maasg 2014-11-25 12:40:53

回答

0

您需要引入一些概念「第一個」:RDD是(分佈式)集合,而不是有序列表。

因此給予相同的功能:

def first (t1, t2): return ... #(your logic here to choose between e.g. (aaa,1,2) and (sss,3,4) ... 

你可以簡單:

theRdd.reduceByKey(first) 
+1

這個問題是錯誤的或者這個答案是錯誤的。這個解決方案不會產生所需的輸出:元組'((aaa,4,5),(sss,3,4))'將成爲輸出數據的一部分,元組'((bbb,2,3), (sss,3,4))'不會成爲輸出的一部分。 – maasg 2014-11-25 00:17:03

+0

我相信這個解決方案將爲第一個(t1,t2)的適當定義提供所需的輸出。看看Suztomo的解決方案,基於第一個()方法系統地選擇左邊的部分是完全一樣的。 再一次,每個鍵保留哪個元組只取決於first()方法中提供的邏輯:RDD是* set *,不是一個列表,沒有一個元組在另一個之前的一般概念,所以它需要明確提供。 – Svend 2014-11-25 14:29:01

+0

直接在給定的RDD上基於'reduceByKey'的任何解決方案都將生成密鑰'(aaa,1,2)','(bbb,2,3)','(aaa,4,5)'。如果問題的預期輸出是正確的,那麼數據集也需要對鍵進行一些轉換。 – maasg 2014-11-25 16:40:14

0

是的,這是可能的。但它不是dictinct(),而是reduceByKey(func, [numTasks])

(假設你使用的Scala爲您火花作業) 一旦你得到這些元組的數組,創建RDD與sc.parallelize並調用導致RDD的reduceByKey方法。在reduceByKey中,您可以指定如何優先考慮這些元組的第二個元素中的值。對於其他RDD相關操作,您可以參考Spark Programming Guide/RDD Operations

使用spark-shell,您可以交互式地嘗試您的功能。

$ spark-1.1.0-bin-hadoop2.3/bin/spark-shell 
... 
scala> val tuples = Array(
|  (("aaa",1,2),("sss",3,4)), 
|  (("bbb",2,3),("aaa",1,2)), 
|  (("bbb",2,3),("sss",3,4)), 
|  (("bbb",2,3),("aaa",4,5)), 
|  (("aaa",4,5),("sss",3,4))) 
scala> val tuplesRdd = sc.parallelize(tuples) 
scala> val reducedRdd = tuplesRdd.reduceByKey((x, y) => x) 
scala> reducedRdd.take(5) 
res0: Array[((String, Int, Int), (String, Int, Int))] = 
     Array(((aaa,1,2),(sss,3,4)), 
      ((aaa,4,5),(sss,3,4)), 
      ((bbb,2,3),(aaa,1,2))) 

我格式化了最後一個輸出。希望這可以幫助。

+0

不是。我不需要有兩個((aaa,1,2),(sss,X,X)) – lantis 2014-11-26 11:56:52