笛卡尔连接 (PY)Spark 最佳实践
Posted
技术标签:
【中文标题】笛卡尔连接 (PY)Spark 最佳实践【英文标题】:Cartesian Join (PY)Spark Best Practices 【发布时间】:2018-04-11 00:47:34 【问题描述】:我是 Spark 的新手,我们目前有一个非常小的集群(14 个节点,每个节点 48 个核心)。我有 2 个数据框。一个是 4100 万条记录(客户),另一个是 100k(位置)。每个表都有纬度和经度,位置表有一些属性。我想计算每个客户与每个位置之间的距离,然后为 15 英里内的每个客户总结位置的附加属性。
我当然可以在计算距离的表之间创建一个连接,然后进行过滤(或在“on”子句中包含距离标准)。但是这个笛卡尔积非常大,永远不会结束。
Spark 是否有任何常规设置需要考虑?有什么比其他方法更好的方法(使用笛卡尔与 DF 连接的 RDD)?我意识到这是一个相当普遍的问题,但我正在寻找任何最佳实践、要考虑的设置、#partitions、要尝试的事情等。
【问题讨论】:
【参考方案1】:一般问题的一般回答:
笛卡尔积是一种蛮力解决方案 - 它不适用于小数据,而且绝对不能扩展。 位置数据要小几个数量级(我假设每条记录包含的数据不超过 1KB 左右)。使用它为您的优势。使用广播连接(如果数据很小,最多几 GB)或将其作为文件分发到每个节点并从那里读取(最多 100 GB 左右)。 有完善的结构和工具可用于查询地理空间数据。使用这些来避免暴力搜索。至少您可以使用本地 k-d 树来快速搜索最近的邻居。即使您的数据增长,您仍然可以利用其基本属性。例如:
定义 15 英里 x 15 英里的网格。 将每个客户分配到一个正方形。 将每个位置分配给一个实际的方格,以及 8 个相邻方格中的每一个方格(当且仅当客户在同一个方格或相邻方格中时,它才可以是 基于网格成员加入 - 数据较大,但可以通过哈希加入完成,不需要笛卡尔积。删除重复项。【讨论】:
我对网格响应感兴趣,我假设网格标识允许等式连接,可以优化并且不会作为笛卡尔积出现?是否有任何工具可以分配给网格并确定 8 个相邻? 是的,它会阻止笛卡尔。我不知道任何特定的工具,但我相当确定任何地理空间工具包都会提供所需的工具。在 15 英里的网格中,您可以安全地近似事物并假设地球是平的。比简单的算术运算(除法、取底、乘法)就足够了。以上是关于笛卡尔连接 (PY)Spark 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
Spark:单个应用程序中的两个 SparkContext 最佳实践
在 Python/PySpark 中 Spark 复制数据框列的最佳实践?