为了账号安全,请及时绑定邮箱和手机立即绑定

PySpark Dataframe 根据函数返回值创建新列

PySpark Dataframe 根据函数返回值创建新列

慕哥6287543 2021-08-24 18:32:20
我有一个数据框,我想根据函数返回的值添加一个新列。此函数的参数是来自同一数据帧的四列。这个和这个有点类似于我想要的,但没有回答我的问题。这是我的数据框(有更多的列然后这四个) + ------ + ------ + ------ + ------ + | lat1   | lng1   | lat2   | lng2   | + ------ + ------ + ------ + ------ + | -32.92 | 151.80 | -32.89 | 151.71 | | -32.92 | 151.80 | -32.89 | 151.71 | | -32.92 | 151.80 | -32.89 | 151.71 | | -32.92 | 151.80 | -32.89 | 151.71 | | -32.92 | 151.80 | -32.89 | 151.71 | + ------ + ------ + ------ + ------ +我想添加另一列“距离”,它是两个位置点(纬度/经度)之间的总距离。我有一个函数,它将四个位置点作为参数,并将差值作为浮点数返回。def get_distance(lat_1, lng_1, lat_2, lng_2):   d_lat = lat_2 - lat_1  d_lng = lng_2 - lng_1   temp = (    math.sin(d_lat / 2) ** 2     + math.cos(lat_1)     * math.cos(lat_2)     * math.sin(d_lng / 2) ** 2  )  return 6367.0 * (2 * math.asin(math.sqrt(temp))) 这是我的尝试导致错误,我也不确定这种方法,它基于我已经提到的其他问题。udf_func = udf(lambda lat_1, lng_1, lat_2, lng_2: get_distance(lat_1, lng_1, lat_2, lng_2), returnType=FloatType())df1 = df.withColumn('difference', udf_func(df.lat1, df_lng1, df.lat2, df.lng2))df_subset1.show()
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

关于 unicode 的堆栈跟踪部分表明该列的类型是 StringType,因为您不能减去两个字符串。您可以使用df.printSchema().

如果您float(lat1)在任何计算之前将所有 lats 和 longs 转换为浮点数(例如),您的 udf 应该可以正常执行。



查看完整回答
反对 回复 2021-08-24
  • 2 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号