第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PySpark:如何將 Python UDF 應用于 PySpark DataFrame 列?

PySpark:如何將 Python UDF 應用于 PySpark DataFrame 列?

紅糖糍粑 2022-07-19 16:41:28
我有一個帶有兩組緯度、經(jīng)度坐標的 PySpark DataFrame。我正在嘗試計算給定行的每組坐標之間的 Haversine 距離。我正在使用haversine()我在網(wǎng)上找到的以下內(nèi)容。問題是它不能應用于列,或者至少我不知道這樣做的語法。有人可以分享語法或指出更好的解決方案嗎?from math import radians, cos, sin, asin, sqrtdef haversine(lat1, lon1, lat2, lon2):    """    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))     # Radius of earth in miles is 3,963; 5280 ft in 1 mile    ft = 3963 * 5280 * c    return ft我知道haversine()上面的函數(shù)有效,因為我使用數(shù)據(jù)框中的一些緯度/經(jīng)度坐標對其進行了測試,并得到了合理的結(jié)果:haversine(-85.8059, 38.250134,           -85.805122, 38.250098)284.1302325439314當我在 PySpark 數(shù)據(jù)框中將示例坐標替換為對應于緯度/經(jīng)度的列名時,我收到錯誤消息。我嘗試了以下代碼,試圖創(chuàng)建一個新列,其中包含計算的Haversine 距離(以英尺為單位):df.select('id', 'p1_longitude', 'p1_latitude', 'p2_lon', 'p2_lat').withColumn('haversine_dist',                            haversine(df['p1_latitude'],                                    df['p1_longitude'],                                    df['p2_lat'],                                    df['p2_lon'])).show()但我得到了錯誤:必須是實數(shù),而不是 Column Traceback(最近調(diào)用最后一次):文件“”,第 8 行,haversine TypeError:必須是實數(shù),而不是 Column這向我表明我必須以某種方式迭代地將我的 hasrsine 函數(shù)應用于我的 PySpark DataFrame 的每一行,但我不確定這個猜測是否正確,即使是這樣,我也不知道該怎么做。順便說一句,我的緯度/經(jīng)度是浮點類型。
查看完整描述

1 回答

?
qq_遁去的一_1

TA貢獻1725條經(jīng)驗 獲得超8個贊

當您可以使用 Spark 內(nèi)置函數(shù)時,不要使用 UDF,因為它們通常性能較差。


這是一個僅使用與您的函數(shù)相同的 Spark SQL 函數(shù)的解決方案:


from pyspark.sql.functions import col, radians, asin, sin, sqrt, cos


df.withColumn("dlon", radians(col("p2_lon")) - radians(col("p1_longitude"))) \

  .withColumn("dlat", radians(col("p2_lat")) - radians(col("p1_latitude"))) \

  .withColumn("haversine_dist", asin(sqrt(

                                         sin(col("dlat") / 2) ** 2 + cos(radians(col("p1_latitude")))

                                         * cos(radians(col("p2_lat"))) * sin(col("dlon") / 2) ** 2

                                         )

                                    ) * 2 * 3963 * 5280) \

  .drop("dlon", "dlat")\

  .show(truncate=False)

給出:


+-----------+------------+----------+---------+------------------+

|p1_latitude|p1_longitude|p2_lat    |p2_lon   |haversine_dist    |

+-----------+------------+----------+---------+------------------+

|-85.8059   |38.250134   |-85.805122|38.250098|284.13023254857814|

+-----------+------------+----------+---------+------------------+

您可以在此處找到可用的 Spark 內(nèi)置函數(shù)。


查看完整回答
反對 回復 2022-07-19
  • 1 回答
  • 0 關(guān)注
  • 104 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號