Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala Spark的2个数据帧之间的交叉连接上应用函数_Scala_Apache Spark_Cross Join - Fatal编程技术网

在Scala Spark的2个数据帧之间的交叉连接上应用函数

在Scala Spark的2个数据帧之间的交叉连接上应用函数,scala,apache-spark,cross-join,Scala,Apache Spark,Cross Join,我在Spark(Scala)中有两个这样的数据帧: 顾客: +--------+-----------+----------------+-----------+---------------+---------------+ |id |postal_code|city_name |valeurPrise|latitudeOK |longitudeOK | +--------+-----------+----------------+-----------+-

我在Spark(Scala)中有两个这样的数据帧:
顾客:

+--------+-----------+----------------+-----------+---------------+---------------+
|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  |
+------+-----------+----------------+---------------+------+
第一个包含1900000行,第二个包含650行。
我想计算每个客户与每个店铺的距离,并将结果存储在客户数据框中的新列中。
例如[23,47,125,8,…]对于第一个客户,…
理想情况下,我也想保留“erd_cd”。
因此,一个tuple可能是一个很好的解决方案。例如[31312:2327654:47,…]将是伟大的。
我知道计算距离的公式,不在乎这个。
我的问题是“如何模拟交叉连接并应用函数”?
我考虑使用交叉联接,但它会生成1900000行(可能有点太多)。
你知道吗?

非常感谢。

商店数据可以作为地图/集合/序列广播,并用于处理客户数据。这将是一个可以并行运行的映射操作

    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>)
val shop=//Map()或Seq()格式的店铺数据,任何适合您需要的
val shopB=spark.sparkContext.broadcast(shop).value
val customer=//构建数据帧或数据集
customer.map{c=>
val距离=A功能(c,shopB)
(c.id,c.邮政编码,…距离)
}.toDF()

如果在第二个df中您只有650行,也许您可以尝试
广播
:谢谢Cesar。非常感谢Salim。我明天会尝试,我会给你一个答案。这带来了代码,它需要完善,因为你需要。