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

时间:2015-11-11 22:24:00

标签: scala apache-spark cartesian

我在Spark Scala中使用笛卡尔变换。如果我的输入包含4个元素(可能是数字/字符/元组),请说

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

myRDD.cartesian(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))

2 个答案:

答案 0 :(得分:2)

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

中输入

如果您想使用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()

答案 1 :(得分:0)

您是否尝试过content.transformer.complex.OpenOffice.Pdf2swf.extensions.pptx.swf.maxSourceSizeKBytes=20480 功能?似乎是通过第一个成员对元组进行排序,然后是第二个成员,依此类推:

sorted