【发布时间】:2019-08-24 13:29:16
【问题描述】:
我有一个带有 3 列的 spark 数据框,它们指示原子的位置,即位置 X、Y 和 Z。现在要找到我需要应用距离公式的每 2 个原子之间的距离。 距离公式为d= sqrt((x2−x1)^2+(y2−y1)^2+(z2-z1)^2)
所以要应用上面的公式,我需要从 x 中的每一行中减去 x 中的每一行,从 y 中的每一行中减去 y 中的每一行,等等。然后对每两个原子应用上述公式。
我试图创建一个用户定义的函数(udf),但我无法将整个 spark 数据帧传递给它,我只能单独传递每一列而不是整个数据帧。因此,我无法遍历整个数据框,而是必须在每一列上应用循环。下面的代码显示了我只为 Position_X 所做的迭代。
@udf
def Distance(Position_X,Position_Y, Position_Z):
try:
for x,z in enumerate(Position_X) :
firstAtom = z
for y, a in enumerate(Position_X):
if (x!=y):
diff = firstAtom - a
return diff
except:
return None
newDF1 = atomsDF.withColumn("Distance", Distance(*atomsDF.columns))
My atomDF spark dataframe look like this, each row shows the x,y,z coordinates of one atom in space. Right now we are taking only 10 atoms.
Position_X|Position_Y|Position_Z|
+----------+----------+----------+
| 27.545| 6.743| 12.111|
| 27.708| 7.543| 13.332|
| 27.640| 9.039| 12.970|
| 26.991| 9.793| 13.693|
| 29.016| 7.166| 14.106|
| 29.286| 8.104| 15.273|
| 28.977| 5.725| 14.603|
| 28.267| 9.456| 11.844|
| 28.290| 10.849| 11.372|
| 26.869| 11.393| 11.161|
+----------+----------+----------+
如何在 pyspark 中解决上述问题。如何从每一行中减去每一行?如何将整个火花数据框传递给 udf 而不是它的列?以及如何避免使用太多的 for 循环?
每两个原子(行)的预期输出将是使用上述距离公式计算的两行之间的距离。我不需要保留那个距离,因为我将使用它的另一个势能公式。或者,如果它可以保留在单独的数据框中,我不介意。
【问题讨论】:
-
你能添加你期望的输出吗?
-
每两个原子(行)的预期输出将是使用上述距离公式计算的两行之间的距离。我不需要保留那个距离,因为我将使用它的另一个势能公式。或者即使它可以保留在单独的数据框或列中,我也不介意。
-
那么,如果您有 10 行(原子),那么您的输出将有
10C2 = 45combinations/rows?基本上,计算每个原子组合的距离。确认。 -
是的,这正是我要找的。span>
标签: python apache-spark pyspark apache-spark-sql