我试图以有效的方式将用户登录与最近的城市相匹配。
从两个具有以下内容的RDD开始:
我想基于haver-sin函数计算出的最近城市,将这两种格式加入到以下格式中。
在Scala中我使用double for循环执行此操作,但Spark中不允许这样做。我试图使用笛卡儿(rdd1.Cartesian(rdd2))然后减少,但这给了我一个巨大的N * M矩阵。
基于最短的haver-sin距离,是否有更快节省空间的方式加入这些RDD?
答案 0 :(得分:1)
解决此问题的一种方法是完全避免使用join
。假设#cities
<< #user
(换句话说,RDD1.count
<< RDD2.count
)简化map
对用户的最有效方法:
RDD2
转换为本地数据结构broadcast
它并用于映射如果RDD2要大到存储在内存中但要小到可以使用单个文件传递,您可以通过用SpatiaLite之类的解决方案替换本地数据结构来轻松调整此方法:
SparkFiles
)最后,如果上述方法都不适合您,请明白join
的方式: