帶你入門GeoSpark系列之一【環境篇】

系列目錄

帶你入門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:
out

發佈了33 篇原創文章 · 獲贊 20 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章