Spark - 搜索空间数据 - 分区修剪

时间:2015-11-01 13:58:33

标签: sql apache-spark spatial

我有大量的地理标记行 - 数亿 - 我需要使用Spark SQL查询所有点的距离计算。 SQL使用基本的三角函数和半径距离函数可以正常工作。返回结果集,纬度点在+/-米之间的纬度,经度相同的纬度;按距离DESC排序,我做一个top-n来找到最近的点。到现在为止还挺好。 数据是全局的,因此将所有点存储在内存中效率很低。

我的问题:

  1. 通过将数据划分为纬度范围,使用经度子范围,我可以实现使用分区修剪多少好处?这会将搜索区域减少到1-3个纬度分区,并且a <1。 10个经度子分区。这是一个少得多的数据;但我不知道Spark SQL优化器可以修剪分区和子分区。我也不清楚对缓存的RDD进行分区修剪是否特别有益。没有参与。

  2. 我可以使用Parquet文件进行分区,然后只读取所需的镶木地板分区,而不是所有数据。是否有其他我应该使用的具有分区功能的文件格式?

1 个答案:

答案 0 :(得分:0)

初次阅读时,您只会受益于分区修剪。如果您的数据已经是柱状数据格式(如镶木地板)并且您没有像其他任何SQL数据库那样读取所有列,那么Spark SQL的优化器将进行一些修剪。如果您在缓存之前对数据进行了一些过滤,那么您只需要查询并保留较小的数据子集。优化器将接收您传入的查询,并尽最大努力从磁盘读取最少量的数据。

ORC文件是您可能想要查看的另一种文件格式。 ORC在坐在HDFS上时通常尺寸较小,但在从磁盘读取数据时速度较慢。

最后,当缓存数据帧时,spark-sql将使用柱状压缩格式来保存数据,你应该能够在内存中放入更多内容,然后你会想到这一点。这也可以实现非常高效的查询,因为您不必读取结果中不会显示的数据。