使用Spark创建二维数组(pyspark)

时间:2018-03-30 22:10:19

标签: python arrays apache-spark pyspark

在Spark中使用Python 2.7, 我有两个维度的两个点列表。列表 A 具有 n 点,列表 B 具有 m 点。 每个点由2个元素(x和y坐标)的列表表示:

set_a = [[x1, y1], [x2, y2], ..., [xn, yn]]
set_b = [[x1, y1], [x2, y2], ..., [xm, ym]]

我想构建一个n*m矩阵 M ,其中通用元素M[i][j]包含 A 中带索引<的点之间的距离em> i 以及 B 中索引为 j 的点。我不是在谈论欧几里德距离,但是我有personal_distance_function(point_a, point_b)我想用它来构建 M

在纯Python 2.7中,我目前正在做这样的事情:

for i in range(len(A)):
    for j in range(len(B)):
        M[i, j] = personal_distance_function(A[i], B[j])

...但由于我需要使用pyspark执行此操作,您对使用SparkContext如何执行此操作有任何建议吗?

1 个答案:

答案 0 :(得分:0)

首先,您需要将列表转换为数据框:

>>> df_a = spark.createDataFrame(set_a, ['a_x', 'a_y'])
>>> df_b = spark.createDataFrame(set_b, ['b_x', 'b_y'])

然后你需要创建一个UDF(用户定义的函数)来在spark中注册你的函数:

>>> from pyspark.sql.functions import udf, struct
>>> from pyspark.sql.types import DoubleType
>>> dist = udf(personal_distance_function, DoubleType())

最后,您可以使用简单的spark代码交叉连接两个数据帧并对它们执行距离函数:

>>> df_a.crossJoin(df_b) \
      .withColumn('dist', dist(struct('a_x', 'a_y'), struct('b_x', 'b_y'))).show()