pyspark:将多个数据帧字段传递给udf

pyspark:将多个数据帧字段传递给udf,pyspark,Pyspark,我不熟悉spark和python。谢谢你的帮助 我有一个UDF,用我们的zipcd、纬度和经度创建了一个spark数据框 UDF: UDF输出示例: distance((101,121),(-121,-212)) 15447.812243421227 数据帧: zip=spark.read.option("sep", ",").csv('wasb://hdiazurepoc@dsazurepoc.blob.core.windows.net/main/zip.txt') zip1=zip.se

我不熟悉spark和python。谢谢你的帮助

我有一个UDF,用我们的zipcd、纬度和经度创建了一个spark数据框

UDF:

UDF输出示例:

distance((101,121),(-121,-212)) 
15447.812243421227

数据帧:

zip=spark.read.option("sep", ",").csv('wasb://hdiazurepoc@dsazurepoc.blob.core.windows.net/main/zip.txt')
zip1=zip.select(zip._c0,zip._c1.cast("Double"),zip._c2.cast("Double"))
zip1数据示例:

zip1.first()        
行(_c0=u'00601',_c1=18.180555,_c2=-66.749961)

现在我试图将纬度和经度从df zip1传递到udf距离,但我得到的错误类似于“需要浮点”。 我相信udf不是从df字段获取数据,而是将df列作为常量值读取;因此,我得到下面的错误

z=zip1.select(distance((zip1._c1,100.23),(zip1._c2,-99.21)))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第5行,距离
TypeError:需要浮点


请告诉我将df字段传递给udf的正确方法。

我不太确定您的数据模式是什么。 但是下面的示例是使用
udf
获得示例答案的正确方法

从pyspark.sql.functions导入*
从pyspark.sql.types导入*
输入数学
def距离(起点、终点):
lat1,lon1=原点
lat2,lon2=目的地
半径=6371公里
dlat=数学弧度(lat2-lat1)
dlon=数学弧度(lon2-lon1)
a=数学sin(dlat/2)*数学sin(dlat/2)+数学cos(数学弧度(lat1))\
*math.cos(math.radians(lat2))*math.sin(dlon/2)*math.sin(dlon/2)
c=2*math.atan2(math.sqrt(a),math.sqrt(1-a))
d=半径*c
返回d
df=spark.createDataFrame([([101,121],-121,-212]),[“原点”,“终点”])
filter_udf=udf(距离,DoubleType())
df.withColumn(“距离”,过滤器_udf(df.origin,df.destination))
+----------+------------+------------------+
|起点|终点|距离|
+----------+------------+------------------+
|[101, 121]|[-121, -212]|15447.812243421227|
+----------+------------+------------------+

@vaira您对上述代码有任何问题吗?如果答案是您想要的,请选择它作为答案,谢谢。
z=zip1.select(distance((zip1._c1,100.23),(zip1._c2,-99.21)))