Scala Spark中笛卡尔变换中的显式排序



我在Spark Scala中使用笛卡尔变换。如果我的输入由4个元素组成(可以是数字/字符/元组),那么说

var myRDD=sc.parallelize(Array("e1","e2","e3","e4"))

笛卡尔(myRDD)将产生所有可能的配对组合,但不一定按顺序。什么是明智的方法来整理这些鞋?即

Array((e1,e1), (e1,e2), (e1,e3), (e1,e4), (e2,e1), (e2,e2), (e2,e3), (e2,e4), (e3,e1), (e3,e2), (e3,e3), (e3,e4), (e4,e1), (e4,e2), (e4,e3), (e4,e4))

如果您需要的是能够识别每个点(这样您就可以确定点对及其L2距离),那么您真正需要的是向RDDDataFrame中的每个条目添加一个id

如果你想使用RDD,我推荐的方法是:

myRDD = sc.parallelize([(0, (0.0, 0.0)), (1, (2.0, 0.0)), 
                        (2, (-3.0, 2.0)), (3, (-6.0, -4.0))])
combinations = myRDD.cartesian(myRDD).coalesce(32)
distances = combinations
    .filter(lambda (x, y): x[0] < y[0])
    .map(lambda ((id1, (x1, y1)), (id2, (x2, y2))): (id1, id2, ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5))
distances.collect()

您尝试过sorted函数吗?似乎按第一个成员对元组进行排序,然后按第二个成员进行排序,依此类推:

scala> val a = Array((1, 1), (3, 3), (2, 2))
a: Array[(Int, Int)] = Array((1,1), (3,3), (2,2))
scala> a.sorted
res1: Array[(Int, Int)] = Array((1,1), (2,2), (3,3))
scala> val a = Array((1, 2), (3, 1), (2, 3))
a: Array[(Int, Int)] = Array((1,2), (3,1), (2,3))
scala> a.sorted
res2: Array[(Int, Int)] = Array((1,2), (2,3), (3,1))
scala> val a = Array((1, 2), (3, 1), (1, 1))
a: Array[(Int, Int)] = Array((1,2), (3,1), (1,1))
scala> a.sorted
res3: Array[(Int, Int)] = Array((1,1), (1,2), (3,1))

相关内容

  • 没有找到相关文章

最新更新