PostGreSQL以及Mysql均有空间引擎扩展,且GeoSpark是针对大数据的空间分析,而SHP、GeoJson等只是小数据集的,PostGIS就能胜任其分析任务。所以对于大数据集的,我们还是要用空间关系数据库存储,利用Spark SQL从数据库中加载数据,获得DataFrame,然后利用Geospark转为几何弹性数据集RDD。
Geospark加载PostgreSQL数据库
关于PostgreSQL和PostGIS的介绍,后续会有更新,今天还是以Geospark为核心,来介绍如何用GeoSpark加载我们的数据库中的空间数据。
假设我们已经安装了PostGreSQL以及PostGIS扩展,并将我们这里的公园数据(park)导入到PostGreSQL中。
这里我的Postgresq的连接参数为:
1 | url=192.168.10.174:5432 |
首先我们需要加入postgresql的jdbc依赖
1 | <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql --> |
初始化Spark,并注册GeosparkSQL
1 | SparkSession spark = SparkSession.builder(). |
利用SparkSQL读取我们导入到postgresql中的数据
首先利用SparkSQL读取我们导入到postgresql中的数据,在postgis中有一个geom字段,他里面存放的是wkb格式的几何信息,对于sparksql来说,geom字段就是一个varchar字段,我们还需要使用geospark的相关函数来将其转为Geometry。
1 | String url = "jdbc:postgresql://192.168.10.174:5432/geospark"; |
1 | +---+------+---------+--------------------+--------------+---------------+---------------+-------+---------+----------+--------------------+ |
利用Geospark将geom列转为Geometry
从postgresql中读取的geom列为wkb格式的Geometry,因此需要利用Geospark将其转为Geometry。
1 | // 在将DataFrame转为RDD的时候,Geospark默认第一列为Geometry |
1 | +--------------------+--------------------+------+ |
Adapter静态类在DataFrame和RDD之间进行转换操作
Geospark提供了Adapter静态类,可以在DataFrame和RDD之间进行转换操作。
1 | JavaRDD<Geometry> rdd = Adapter.toJavaRdd(df); |
1 | POLYGON ((-123.15566057081632 49.26206733490204, -123.15564728017853 49.26241791476514, -123.15548939905344 49.262415429329856, -123.15550257747702 49.26206484963618, -123.15566057081632 49.26206733490204)) null 1 |