在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如何执行此操作有任何建议吗?
答案 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()