gpt4 book ai didi

apache-spark - 基于Spark中的函数加入两个没有公共(public) key 的RDD

转载 作者:行者123 更新时间:2023-12-03 11:11:33 25 4
gpt4 key购买 nike

我正在尝试以有效的方式将用户登录与最近的城市相匹配。

从两个 RDD 开始:

  • RDD1: checkin_id,user_id, session_id, utc_time, timezone_offset,纬度、经度、类别、子类别
  • RDD2:城市名称、纬度、经度、国家代码、国家、城市类型

我想根据 haver-sin 函数计算出的最近城市将这两个连接到以下格式。

  • checkin_id ,user_id, session_id, utc_time, timezone_offset,纬度、经度、类别、子类别、城市名称、国家/地区

在 Scala 中,我使用双 for 循环执行此操作,但这在 Spark 中是不允许的。我尝试使用笛卡尔 ( rdd1.Cartesian(rdd2) ) 然后减少,但这给了我一个巨大的 N*M 矩阵。

是否有一种基于最短 haver-sin 距离的更快、更节省空间的方法来连接这些 RDD?

最佳答案

解决这个问题的一种方法是完全避免join。假设 #cities <<#user(换句话说 RDD1.count <<RDD2.count)简单地映射用户的最有效方法:

  • RDD2转换为本地数据结构
  • 将其转换为可用于高效地理空间查询的格式(例如 K-d tree
  • 广播并用于映射

如果 RDD2 太大而无法存储在内存中,但又小到足以使用单个文件传递,您可以轻松调整此方法,将本地数据结构替换为类似 SpatiaLite 的解决方案:

  • 将数据写入数据库
  • 使用标准 Spark 工具 (SparkFiles) 将其分发给工作人员
  • 使用对本地数据库的查询来映射用户

最后,如果以上方法都不适合您,请明智地选择加入的方式:

  • 您可以轻松地使用纬度和经度将用户位置映射到某个本地实体,例如大陆、国家/地区、地方行政实体。使用此信息执行初始加入(显然,如果用户在欧洲某个地方检查墨尔本,澳大利亚毫无意义)
  • 使用 GeoHash 等工具将用户和城市分配到可用于连接的存储桶(这需要在边界情况下进行一些调整 - 如果单个对象位于赤道附近或180 度经线)。

关于apache-spark - 基于Spark中的函数加入两个没有公共(public) key 的RDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36246234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com