Я применяю метод, и он выдает ошибку, потому что слепок выполнен не очень хорошо.
Как я мог 1) преобразовать все поля более эффективным способом, 2) используйте withColumn только один раз, а затем 3) запустить метод с числами (не строкой):
q5 = q4.withColumn("DISTANCE", q4["LOCLAT"].cast(IntegerType()))
q6 = q4.withColumn("DISTANCE", q4["LOCLONG"].cast(IntegerType()))
q7 = q4.withColumn("DISTANCE", q4["LOCLAT2"].cast(IntegerType()))
q8 = q4.withColumn("DISTANCE", q4["LOCLONG2"].cast(IntegerType()))
q9 = (q4.withColumn('distance', haversine('LOCLONG', 'LOCLAT', 'LOCLONG2', 'LOCLAT2')))
Спасибо!!
Я не уверен, чего вы хотите достичь, но вот как преобразовать все 4 столбца в целочисленный тип и вызвать функцию haversine
:
df = q4.select(
'*',
*[F.col(c).cast('int').alias(c + '_int')
for c in ['LOCLONG', 'LOCLAT', 'LOCLONG2', 'LOCLAT2']]
)
df = df.withColumn(
'distance',
haversine('LOCLONG_int', 'LOCLAT_int', 'LOCLONG2_int', 'LOCLAT2_int')
)
Привет, большое спасибо!! Код выглядит хорошо и работает хорошо, но по какой-то причине при применении метода он дает мне эту ошибку: должно быть реальное число, а не str Traceback (последний последний вызов): Файл "<stdin>", строка 11, в haversine TypeError: должно быть реальным числом, а не str
Метод взял отсюда: stackoverflow.com/questions/4913349/…
codefrom math import radians, cos, sin, asin, sqrt def haversine(lon1, lat1, lon2, lat2): """ Calculate the great circle distance between two points on the earth (specified in decimal degrees) """ # convert decimal degrees to radians lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) # haversine formula dlon = lon2 - lon1 dlat = lat2 - lat1 a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 c = 2 * asin(sqrt(a)) r = 6371 # Radius of earth in kilometers. Use 3956 for miles return c * r
@ Ана, ты преобразовала функцию в UDF? поставь @F.udf над чертой def haversine(...)
вы перезаписываете столбец «расстояние» в каждой строке и назначаете полученный фрейм данных неиспользуемой переменной. ты уверен, что это то, что ты хочешь сделать?