簡體   English   中英

在 2 個數據幀 Scala Spark 之間的交叉連接上應用函數

[英]Apply function on a cross-join between 2 dataframes Scala Spark

我在 Spark(Scala)中有 2 個數據框,如下所示:
顧客 :

+--------+-----------+----------------+-----------+---------------+---------------+
|id      |postal_code|city_name       |valeurPrise|latitudeOK     |longitudeOK    |
+--------+-----------+----------------+-----------+---------------+---------------+
|22318764|94200      |Ivry-sur-Seine  |Number     |48.815679000000|2.393150000000 |
|983026  |39330      |Mouchard        |Street     |46.978240000000|5.807290000000 |
|810029  |33260      |La Teste-de-Buch|Street     |44.539033000000|-1.152371000000|
|1880521 |77360      |Vaires-sur-Marne|Street     |48.877451000000|2.649342000000 |
|19502247|80090      |Amiens          |Number     |49.871260000000|2.300264000000 |
|17550309|72100      |Le Mans         |Number     |47.973960000000|0.206240000000 |
|22311804|94250      |Gentilly        |Number     |48.816344000000|2.340399000000 |
|284138  |14000      |Caen            |Street     |49.186034000000|-0.353779000000|
|2011904 |83000      |Toulon          |Street     |43.125340000000|5.930290000000 |
|21922785|92110      |Clichy          |Number     |48.910761000000|2.307201000000 |
+--------+-----------+----------------+-----------+---------------+---------------+

店鋪 :

+------+-----------+----------------+---------------+------+
|erd_cd|ville      |gps_wgs84_lat   |gps_wgs84_lon  |active|
+------+-----------+----------------+---------------+------+
|31312 |MAMOUDZOU  |-12.780550000000|45.227770000000|VRAI  |
|31901 |ST JOSEPH  |-21.376620000000|55.616100000000|VRAI  |
|31307 |STE MARIE  |-20.899934381104|55.517562110882|VRAI  |
|31303 |ST BENOIT  |-21.043730000000|55.717850000000|VRAI  |
|31302 |ST PIERRE  |-21.340676722653|55.477203422331|VRAI  |
|35023 |STE SUZANNE|-20.929250000000|55.633290000000|VRAI  |
|31305 |ST DENIS   |-20.880840000000|55.450700000000|VRAI  |
|31304 |LE PORT    |-20.956710000000|55.308050000000|VRAI  |
|32530 |ST PAUL    |-21.008640000000|55.271290000000|VRAI  |
|19585 |BEAUNE     |47.023000000000 |4.837550000000 |VRAI  |
+------+-----------+----------------+---------------+------+

第一個包含 19 000 000 行,第二個包含 650 行。
我想計算每個客戶與每個商店的距離,並將結果存儲在客戶數據框中的新列中。
例如,第一個客戶的 [23, 47, 125, 8, ...],...
理想情況下,我也想保留“erd_cd”。
所以元組可能是一個很好的解決方案。 例如 [31312:23, 27654:47,...] 會很棒。
我知道計算距離的公式,不要在意這個。
我的問題是“如何模擬交叉連接並應用函數”?
我考慮過交叉連接,但它會生成 19 000 000 000 行(可能有點太多了)。
你有什么想法嗎?
非常感謝。

商店數據可以作為 Map/Set/Seq 廣播並用於處理客戶數據。 這將是一個可以極其並行運行的映射操作。

    val shop = //shop data in Map() or Seq() format, whatever suits your need
    val shopB = spark.sparkContext.broadcast(shop).value

    val customer = //build the dataframe or dataset

    customer.map{ c =>
      val distance  = aFunction(c, shopB)

      (c.id, c.postal_code,..... distance)
    }.toDF(<column names>)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM