Loops pyspark数据帧上的交叉循环操作

Loops pyspark数据帧上的交叉循环操作,loops,pyspark,Loops,Pyspark,我在pyspark数据帧(比如DF1、DF2)中有2列(lat_lon) DF1: 拉图隆 -84.412977,39.152501 -84.416946,39.153505 DF2: 拉图隆 -85.412977,39.152501 -85.416946,40.153505 我希望将DF1的每个元素的循环与DF2的每个元素交叉,并使用函数计算距离。现在基于距离,我将计数保存为对应于DF1行的值 例如: list1=[-84.412977,39.152501],-84.416946,39.15

我在pyspark数据帧(比如DF1、DF2)中有2列(lat_lon)

DF1:
拉图隆
-84.412977,39.152501
-84.416946,39.153505
DF2:
拉图隆
-85.412977,39.152501
-85.416946,40.153505
我希望将DF1的每个元素的循环与DF2的每个元素交叉,并使用函数计算距离。现在基于距离,我将计数保存为对应于DF1行的值

例如:

list1=[-84.412977,39.152501],-84.416946,39.153505]]
列表2=[-85.412977,39.152501],-85.416946,40.153505]]
列表4=[]
对于范围内的i(len(列表1)):
计数=0
对于范围内的j(len(列表2)):

如果(Haversine(list1[i],list2[j]).meters)首先让我们创建数据帧

df1=spark.createDataFrame(列表1,['lat','long'])
df2=spark.createDataFrame(列表2,['lat','long'])
您必须使用
Haversine
函数创建
UDF

import pyspark.sql.函数作为psf
从pyspark.sql.types导入DoubleType
haversine_udf=psf.udf(lambda lat1,long1,lat2,long2:haversine([lat1,long1],[lat2,long2])。米,双类型()
最后,要针对df2的每个元素获得
df1的每个元素,您可以使用
交叉连接(代价高昂):

df1.交叉连接(df2)\
.带柱(“米”,haversine_udf(df1.lat,df1.long,df2.lat,df2.long))\
.过滤器(“仪表<500”)\
.groupBy(df1.lat,df1.long)\
.count()
您可以通过
广播
增加计算量,如果其中一个数据帧较小,则会将其复制到每个节点内存中:

df1.交叉连接(psf.广播(df2))

这就是我的工作原理:

id1=ds1.select('lat1','lon1').rdd.map(lambda l: (l[0],l[1]))
id2=ds2.select('lat2','lon2').rdd.map(lambda l: (l[0],l[1]))

mm=id1.cartesian(id2)
kk=mm.map(lambda l: Haversine(l[0],l[1]).meters)

你确定要用Spark来做这个?听起来一点也不适合Spark…我想将距离计算并行化。是否可以并行处理DF1的每一行(或一组行)与DF2的行的计算,然后聚合结果为什么要进行向下投票?谢谢,这看起来很有希望。我分配了var=df1。交叉连接(df2)。。。如何访问df1行的计数值?这给我带来了一个错误:var.select('count')。show(1)我没有访问您的
Haversine
函数的权限,因此无法测试它。你得到了什么错误?添加了haversine函数我没有得到任何错误。您能用错误跟踪更新您的问题吗?不是运行中的错误,而是访问count变量。我该怎么做?