【问题标题】:Constructing a triangular distance matrix dataframe in pyspark?在pyspark中构造一个三角距离矩阵数据框?
【发布时间】:2018-04-27 12:12:08
【问题描述】:

我想使用 pyspark 中的数据帧中的值构造一个距离矩阵。我现在拥有的是

+----+-------------+
| id | list        |
+----+-------------+
| 1  | [a, b, ...] |
+----+-------------+
| 2  | [c, d, ...] |
+----+-------------+
| 3  | [e, f, ...] |
+----+-------------+

我想使用我自己的距离函数并做类似的事情

for i in range(len(ids)):
    for j in range(i + 1, len(ids)):
        dist = calculate_distance(features[i], features[j])
        add_row_to_distance_df([ids[i], ids[j], dist])

编辑:预期输出是

+-----+-----+-----------------------------+
| id1 | id2 | dist                        |
+-----+-----+-----------------------------+
| 1   | 2   | d([a, b, ...], [c, d, ...]) |
+-----+-----+-----------------------------+
| 1   | 3   | d([a, b, ...], [e, f, ...]) |
+-----+-----+-----------------------------+
| 2   | 3   | d([c, d, ...], [e, f, ...]) |
+-----+-----+-----------------------------+

我该怎么做呢?

【问题讨论】:

  • 你试过什么?如果您展示您的尝试,您将获得更多帮助。您希望最终输出是什么样的?
  • @AChampion:我不知道如何开始。我认为可以对数据帧中的所有ids 进行某种映射,但要构建一个三角矩阵,我必须不断丢弃之前计算的不相关的ids,这听起来效率很低。跨度>
  • abc 是否代表您想要距离的其他 ID?
  • @AChampion:不,它们是用于计算距离的“特征”。

标签: python pyspark distance-matrix


【解决方案1】:

您可以使用cartesian()filter() 只是必要的三角形,例如:

In []:
def calculate_distance(a, b):
    return f'd({a}, {b})'  # Py 3.6

rdd = sc.parallelize([(1, ['a', 'b', 'c']), (2, ['c', 'd', 'e']), (3, ['e', 'f', 'g'])])

(rdd.cartesian(rdd)
 .filter(lambda x: x[0][0] < x[1][0])
 .map(lambda x: (x[0][0], x[1][0], calculate_distance(x[0][1], x[1][1])))
 .collect())

Out[]:
[(1, 2, "d(['a', 'b', 'c'], ['c', 'd', 'e'])"),
 (1, 3, "d(['a', 'b', 'c'], ['e', 'f', 'g'])"),
 (2, 3, "d(['c', 'd', 'e'], ['e', 'f', 'g'])")]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2013-10-09
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    相关资源
    最近更新 更多