我有兩本字典。其中一個 whereUserID是 key,它們的 location 是 value。第一個專案看起來像這樣:
{'U1001': ('22.139997', '-100.978803'),
'U1002': ('22.150087', '-100.983325')}
另一個字典 wherePlaceID是鍵,位置是值。第一個專案看起來像這樣:
{'134999': ('18.915421', '-99.184871'),
'132825': ('22.1473922', '-100.983092')}
現在我得到了一個 RDD,其中UserID, PlaceID, 并且給出了用戶對 Place 的評價:
[('U1077', '135085', 2),
('U1077', '135038', 2)]
我想計算用戶和地點之間的距離并使用geodesicfromgeopy.distance
我可以(轉換和)加入(的值)字典并將它們替換為UserIDandPlaceID但我正在尋找使用 pyspark 語言的解決方案。
我來了,.mapValues但這對我來說并不完全有效。
因此,最終,我想獲得給出的距離和評分:
[('2', 693.4067254748844),
('2', 806.8757681276663)]
uj5u.com熱心網友回復:
您可以從 中創建 RDD users_dict,places_dict然后加入ratings_rdd以獲取用戶和評分地點的坐標。然后使用地圖,呼叫geodesic計算距離。
下面是一個例子:
from geopy.distance import geodesic
users_dict = {'U1077': ('22.139997', '-100.978803'), 'U1002': ('22.150087', '-100.983325')}
places_dict = {'135085': ('18.915421', '-99.184871'), '135038': ('22.1473922', '-100.983092')}
users_rdd = sc.parallelize(list(users_dict.items()))
places_rdd = sc.parallelize(list(places_dict.items()))
ratings_rdd = sc.parallelize([('U1077', '135085', 2), ('U1077', '135038', 2)])
# RDD(UserId, (PlaceId, Rating))
ratings_rdd = ratings_rdd.map(lambda x: (x[0], list(x[1:])))
# RDD(PlaceId, (UserId, UserCoordinates, Rating))
joined1 = ratings_rdd.join(users_rdd).map(lambda x: (x[1][0][0], (x[0], x[1][1], x[1][0][1])))
# RDD(UserId, PlaceId, Rating, Distance)
result = joined1.join(places_rdd).map(
lambda x: (x[1][0][0], x[0], x[1][0][2], geodesic(x[1][0][1], x[1][1]).kilometers)
)
print(result.collect())
#[('U1077', '135085', 2, 403.0361166435645), ('U1077', '135038', 2, 0.9307697045815713)]
您可以列印中間 RDD 以了解邏輯。簡而言之,我們需要將 rdds 鍵控UserId加入,users_rdd然后鍵控PlaceID加入places_rdd
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/387862.html
