gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:07:46 25 4
gpt4 key购买 nike

我是 Spark 和 Python 的新手。任何帮助表示赞赏。

我有一个 UDF 并使用美国 zipcd、纬度和经度创建了一个 Spark 数据框

UDF:

import math
def distance(origin, destination):
lat1, lon1 = origin
lat2, lon2 = destination
radius = 6371 # km
dlat = math.radians(lat2-lat1)
dlon = math.radians(lon2-lon1)
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(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 = radius * c
return d

示例 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 距离,但出现“需要 float ”之类的错误。我相信 udf 没有从 df 字段获取数据,而是将 df 列读取为常量值;因此我遇到了以下错误。

z=zip1.select(distance((zip1._c1,100.23),(zip1._c2,-99.21)))

回溯(最近一次调用最后一次):
文件“”,第 1 行,位于
文件“”,第 5 行,距离
类型错误:需要一个 float

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

最佳答案

我不太确定您拥有的数据架构是什么。但以下示例是使用 udf 获取示例答案的正确方法。

from pyspark.sql.functions import *
from pyspark.sql.types import *
import math

def distance(origin, destination):
lat1, lon1 = origin
lat2, lon2 = destination
radius = 6371 # km
dlat = math.radians(lat2-lat1)
dlon = math.radians(lon2-lon1)
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(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 = radius * c
return d

df = spark.createDataFrame([([101, 121], [-121, -212])], ["origin", "destination"])
filter_udf = udf(distance, DoubleType())
df.withColumn("distance", filter_udf(df.origin, df.destination))

+----------+------------+------------------+
| origin| destination| distance|
+----------+------------+------------------+
|[101, 121]|[-121, -212]|15447.812243421227|
+----------+------------+------------------+

关于pyspark:将多个数据帧字段传递给 udf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47824841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com