Spark:使用不同的

时间:2014-11-24 08:45:42

标签: scala apache-spark

如果我有以下元组:

((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))

是否可以使用distinct()?,第一个元素是元组

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

2 个答案:

答案 0 :(得分: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 :(得分:0)

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

(假设你使用Scala作为你的火花工作) 获得这些元组的数组后,使用sc.parallelize创建RDD并调用生成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)))

我格式化了最后一个输出。希望这会有所帮助。