系列目錄
帶你入門GeoSpark系列之一【環境篇】
帶你入門GeoSpark系列之二【Spatial RDD篇】
帶你入門GeoSpark系列之三【SQL&空間查詢&索引篇】
前言
由於項目需要處理一些地理空間數據,而原生Spark不能滿足,這幾天搗鼓GeoSpark有一些收穫,開個坑總結一下。
GeoSpark介紹
GeoSpark是基於Spark之上的分佈式羣集計算系統。GeoSpark擴展了Spark Core和SparkSQL並提出了空間彈性分佈式數據集(Spatial Resilient Distributed Datasets (SRDDs))同時提供了可視化組件。簡而言之就是可以利用它在Spark上做空間運算。能夠基於經緯度等信息創建點(Point)線(LineString)面(Polygon)。並提供了幾種空間查詢:空間臨近查詢(Spatial KNN Query)、空間範圍查詢( Spatial Range Query)、空間連接查詢(Spatial Join Query)和距離連接查詢(Distance Join Query)。
環境準備
JDK 1.8
Scala 2.11.x
Pom依賴
Idea創建簡單的scala maven項目即可,然後配置Pom依賴
注意,GeoSpark的版本一定要和相應的Spark版本對應,怎麼對應呢?
官方給出了一份說明:
https://datasystemslab.github.io/GeoSpark/download/GeoSpark-All-Modules-Maven-Central-Coordinates/
可以看到不同的spark對應的geospark-sql的artifactId後綴版本不一樣!
同時我們也可以看出官方對spark的支持最新是到spark 2.3,所以避免踩坑筆者用了這個版本,其他版本未測試。
<properties>
<scala.version>2.11.8</scala.version>
<spark.version>2.3.4</spark.version>
<scala.binary.version>2.11</scala.binary.version>
<geospark.version>1.3.0</geospark.version>
</properties>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.datasyslab</groupId>
<artifactId>geospark</artifactId>
<version>${geospark.version}</version>
</dependency>
<dependency>
<groupId>org.datasyslab</groupId>
<artifactId>geospark-sql_2.3</artifactId>
<version>${geospark.version}</version>
</dependency>
</dependencies>
嚐鮮
新建一個CSV文件checkin.csv
:
-88.175933,32.360763,gas
-88.388954,32.357073,bar
-88.221102,32.35078,restaurant
Code:
package com.suddev.bigdata.core
import org.apache.spark.serializer.KryoSerializer
import org.apache.spark.{SparkConf, SparkContext}
import org.datasyslab.geospark.enums.FileDataSplitter
import org.datasyslab.geospark.serde.GeoSparkKryoRegistrator
import org.datasyslab.geospark.spatialRDD.PointRDD
object DemoApp {
def main(args: Array[String]): Unit = {
// 創建SparkConf
val conf = new SparkConf().
setAppName("GeoSparkDemo1").
setMaster("local[*]").
set("spark.serializer", classOf[KryoSerializer].getName).
set("spark.kryo.registrator", classOf[GeoSparkKryoRegistrator].getName)
val sc = new SparkContext(conf)
val pointRDDInputLocation = "data/checkin.csv"
// 這個變量控制我們的地理經度和緯度在數據的哪兩列,我們這裏是第0,1列,Offset就設置爲0
val pointRDDOffset = 0
val pointRDDSplitter = FileDataSplitter.CSV
// 這個參數允許我們除了經緯度外還可以攜帶其他自定義數據
val carryOtherAttributes = true
val objectRDD = new PointRDD(sc, pointRDDInputLocation,pointRDDOffset, pointRDDSplitter, carryOtherAttributes)
// 獲取rawRDD進行遍歷輸出
objectRDD.rawSpatialRDD.rdd.collect().foreach(println)
}
}
Output: