2014-11-24 109 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