我想合并两个带有条件的数据框。
在这种情况下,有一个计算浮点数的函数。该函数的输入是转换为浮点数的字符串。
这是我的代码:
def calculateStraightLineDistance(lat1, lon1, lat2, lon2):
p = pi/180
a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p) * cos(lat2*p) * (1-cos((lon2-lon1)*p))/2
return 12742 * asin(sqrt(a))
join_condition = [calculateStraightLineDistance(float(sd.lat_soc), float(sd.lon_soc),
float(ad.lat_agen), float(ad.lon_agen)) <= 50.0 ]
merged_data = sd.join(ad, join_condition, 'left')
但是,此代码引发以下错误:
TypeError Traceback (most recent call last)
<ipython-input-30-7e6c5d9332f8> in <module>()
9
10
---> 11 join_condition = [calculateStraightLineDistance(float(sd.lat_soc), float(sd.lon_soc),
12 float(ad.lat_agen), float(ad.lon_agen)) <= 50.0 ]
13
TypeError: float() argument must be a string or a number, not 'Column'
我不确定这是什么问题。没有任何强制转换和功能的先前条件可以很好地工作。例如:
join_condition = [ad.lat_agen >= sd.lat_soc]
我在这里做什么错了?
编辑:
ad= spark.sql(agencies_query)
ad.lat_agen.cast("float")
ad.printSchema()
将打印:
|-- lat_agen: string (nullable = true)
|-- lon_agen: string (nullable = true)
答案 0 :(得分:0)
您正在将功能float
应用于列sd.lat_soc
。
正如消息明确指出的那样,float
仅接受字符串或数字,而不接受列对象。
如果要将列的内容转换为浮点型,请使用:sd.lat_soc.cast("float")
。
答案 1 :(得分:0)
尽管史蒂文的答案是我可以在网上找到的,但我还是没有设法使它起作用。
但是,这是我如何实现的:
ad = ad.withColumn("lat_gen", ad.lat_agen.cast(FloatType()))
printSchema提供预期的输出:
ad.printschema()
|-- lat_agen: float (nullable = true
)