2015-11-01 69 views
0

我有大量的地理標記行 - 數以百萬計 - 我需要使用Spark SQL對所有點進行距離計算。使用基本的三角函數和一個正弦函數距離函數,SQL可以正常工作。緯度點的緯度在緯度+/-米之間,經度的緯度相同;按距離DESC排序,我做了一個top-n找到最近的點。到現在爲止還挺好。 數據是全局數據,因此將所有點存儲在內存中效率不高。Spark - 搜索空間數據 - 分區修剪

我的問題:

  1. 我多少利益可實現使用分區修剪通過劃分數據成緯度範圍,經度子範圍?這會將搜索區域縮小到1-3緯度分區,並減少10個經度子分區。這是少得多的數據;但我不知道Spark SQL優化器是否可以修剪分區和子分區。我還不清楚緩存RDD上的分區修剪是否特別有益。沒有參與。

  2. 我可以使用Parquet文件進行分區,然後只讀取所需的實木複合地板分區,而不是所有數據。有沒有我應該使用的具有分區功能的其他文件格式?

回答

0

當您進行初始讀取時,您確實只會受益於分區修剪。如果你的數據已經是列式數據格式(比如parquet),並且你沒有像所有其他SQL數據庫那樣讀取所有的列,Spark SQL的優化器會做一些修剪。如果您在緩存之前對數據進行了一些過濾,那麼您只會查詢並堅持更小的數據子集。優化器將接受您傳入的查詢,並盡最大努力從磁盤讀取最少量的數據。

ORC文件可能是您可能想要查看的另一種文件格式。坐在HDFS上時,ORC的大小通常較小,但在從磁盤讀取數據時,其速度較慢。

最後,當緩存一個數據幀時,spark-sql將使用列壓縮格式來保存數據,你應該能夠把更多的內存放在內存中,然後你可以這樣想。這也允許非常有效的查詢,因爲您不必讀取不會顯示在結果中的數據。