【问题标题】:How to correlate all combination of arrays in an RDD?如何关联RDD中的所有数组组合?
【发布时间】:2016-04-19 20:19:34
【问题描述】:

我有一个来自model.productFeatures() 的RDD,它以(id, array("d", (...))) 的形式返回一个RDD。例如:

(1, array("d", (0, 1, 2)))
(2, array("d", (4, 3, 2)))
(3, array("d", (5, 3, 0)))
...

我想计算每个数组之间的成对相关性,然后为每个id 返回另一个数组具有最高相关性的id

【问题讨论】:

  • 嘿,我不理解它的数学部分,你能用外行的术语解释一下吗?

标签: hadoop apache-spark pyspark


【解决方案1】:

您需要做的第一件事是获取所有元素对,除了它们相同的“对角线”。

>>> rdd.cartesian(rdd).filter(lambda (x, y): x != y).collect()
[((1, array('d', [0.0, 1.0, 2.0])), (2, array('d', [4.0, 3.0, 2.0]))),    
 ((1, array('d', [0.0, 1.0, 2.0])), (3, array('d', [5.0, 3.0, 0.0]))), 
 ((2, array('d', [4.0, 3.0, 2.0])), (1, array('d', [0.0, 1.0, 2.0]))), 
 ((3, array('d', [5.0, 3.0, 0.0])), (1, array('d', [0.0, 1.0, 2.0]))), 
 ((2, array('d', [4.0, 3.0, 2.0])), (3, array('d', [5.0, 3.0, 0.0]))), 
 ((3, array('d', [5.0, 3.0, 0.0])), (2, array('d', [4.0, 3.0, 2.0])))]

然后是一个计算相关性并重新排列的函数,为最后一步做准备。让我们假设“相关性”是指numpy.correlate 所做的事情。

def corr_pair(((id1, a1), (id2, a2))):
    return id1, (id2, np.correlate(a1, a2)[0])

>>> rdd.cartesian(rdd).filter(lambda (p1, p2): p1 != p2).map(corr_pair).collect()
[(1, (2, 7.0)), (1, (3, 3.0)), (2, (1, 7.0)), (3, (1, 3.0)), (2, (3, 29.0)), (3, (2, 29.0))]

要获得与每个第一个 ID 具有最大相关性的第二个 ID,您可以使用 reduceByKey 并始终保留较大的那个:

def keep_higher((id1, c1), (id2, c2)):    
    if c1 > c2:
        return id1, c1
    else:
        return id2, c2

>>> rdd.cartesian(rdd).filter(lambda (x, y): x != y).map(corr_pair).reduceByKey(keep_higher).collect()
[(1, (2, 7.0)), (2, (3, 29.0)), (3, (2, 29.0))]

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2016-12-25
    • 1970-01-01
    • 2014-06-10
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多