笛卡尔加入(PY)Spark最佳实践

时间:2018-04-11 00:47:35

标签: apache-spark pyspark apache-spark-sql

我是Spark新手,我们目前拥有一个非常小的集群(14个节点,每个节点48个核心)。我有2个数据帧。一个是4100万条记录(客户),另一个是100万条(位置)。每个表都有纬度和经度,位置表有一些属性。我想计算每个客户与每个位置之间的距离,然后总结每个客户在15英里范围内的位置的附加属性。

我当然可以在表之间创建一个连接,我计算距离然后过滤(或者在' on'子句中包含距离标准)。但是这种笛卡尔产品非常大而且永远不会完成。

Spark有什么常规设置可供考虑吗?任何方法都比其他方法更好(RDD与笛卡尔与DF连接)?我意识到这是一个相当普遍的问题,但我正在寻找任何最佳实践,设置考虑,#partitions,尝试的事情等。

1 个答案:

答案 0 :(得分:0)

一般问题的一般答案:

  • 笛卡尔积是一种强力解决方案 - 它在小数据上效果不佳,绝对不能扩展。
  • 位置数据的数量级要小一些(我假设每条记录的数据不超过1KB)。使用它有利于您。使用广播连接(如果数据很小,最多几GB)或将其作为文件分发到每个节点并从那里读取(最多100GB左右)。
  • 有完善的结构和工具可用于查询地理空间数据。使用这些来避免暴力搜索。至少可以使用本地k-d树快速搜索最近的邻居。
  • 即使您的数据增长,您仍然可以利用其基本属性。例如:

    • 定义15英里x 15英里的网格。
    • 将每个客户分配到一个正方形。
    • 将每个位置分配给实际的正方形,以及8个相邻正方形中的每一个(当且仅当它在同一个正方形或相邻正方形时,客户可以<15英里)。这将使位置数据倍增9倍。
    • 基于网格成员资格加入 - 数据较大,但可以使用散列连接完成,不需要笛卡尔积。删除重复项。