(二)Sedona入门(空间叠加分析)

本次以叠加分析为例,介绍Sedona的RDD和SQL两种空间分析方式,数据源选择Postgresql,是已经入好库的OSM的building数据,可能有人问那为什么不用Postgis做分析,主要是千万级的我除了这个不知道选择什么数据来源……

废话不多说,开始干。

准备工作

  1. Spark-Shell

    如果是用Spark-Shell方式,提前把sedona编译好的包下载下来,然后用下面这个命令替换下jar包路径和master地址就可以了(注意自己准备postgresql的jar包)。

    spark-shell --jars file:///opt/sedona/sedona-core-3.0_2.12-1.1.0-incubating.jar,file:///opt/sedona/sedona-sql-3.0_2.12-1.1.0-incubating.jar,file:///opt/sedona/sedona-python-adapter-3.0_2.12-1.1.0-incubating.jar,file:///opt/sedona/sedona-viz-3.0_2.12-1.1.0-incubating.jar,file:///opt/sedona/postgresql-42.2.24.jar,file:///opt/sedona/jts-core-1.18.0.jar,file:///opt/sedona/geotools-wrapper-1.1.0-25.2.jar --driver-class-path file:///opt/sedona/postgresql-42.2.24.jar  --master spark://master:7077
    
  2. IDE的话,留在下一讲整理好工程,在讲

SQL代码实现

  1. 如果是做大数据的叠加分析,对PG的表最好加个索引ID,然后就能利用Spark的并行计算优势。最简单的就是加一个自增序列,然后添加一个索引

    alter table [your_table_name] add column pid bigserial primary key
    create index [your_index_name] on [your_table_name]("[column_name]")
    
  2. 导入包

    import org.apache.spark.serializer.KryoSerializer
    import org.apache.sedona.viz.core.Serde.SedonaVizKryoRegistrator
    import org.apache.sedona.core.spatialRDD.SpatialRDD
    import org.apache.sedona.core.utils.SedonaConf
    import org.apache.sedona.sql.utils.{Adapter, SedonaSQLRegistrator}
    import org.apache.sedona.viz.core.Serde.SedonaVizKryoRegistrator
    import org.apache.sedona.viz.sql.utils.SedonaVizRegistrator
    import org.apache.spark.serializer.KryoSerializer
    import org.apache.spark.sql.SparkSession
    import org.apache.sedona.sql.utils.Adapter
    import org.locationtech.jts.geom.Geometry
    import org.locationtech.jts.geom.Envelope
    import org.apache.log4j.{Level, Logger}
    import org.apache.sedona.core.enums.{GridType, IndexType}
    import org.apache.sedona.core.spatialOperator.JoinQuery
    import org.apache.sedona.core.spatialRDD.{CircleRDD, SpatialRDD}
    import org.apache.sedona.sql.utils.{Adapter, SedonaSQLRegistrator}
    import org.apache.sedona.viz.core.{ImageGenerator, RasterOverlayOperator}
    import org.apache.sedona.viz.core.Serde.SedonaVizKryoRegistrator
    import org.apache.sedona.viz.sql.utils.SedonaVizRegistrator
    import org.apache.sedona.viz.utils.ImageType
    import org.apache.spark.serializer.KryoSerializer
    import org.apache.spark.sql.SparkSession
    import org.locationtech.jts.geom.Geometry
    import org.locationtech.jts.geom.{Coordinate, Geometry, GeometryFactory}
    
  3. 注册Sedona ,并设置一些全局参数(代码的sc就是SparkContext,如果是在IDE里,需要自己初始化)

    sc.getConf.set("spark.serializer", classOf[KryoSerializer].getName) 
    sc.getConf.set("spark.kryo.registrator", classOf[SedonaVizKryoRegistrator].getName)
    sc.getConf.set("sedona.join.numpartition", "6000") // 取决于数据量大小,这个数字设置越大,task就越多,需要的服务器性能也就越高
    sc.getConf.set("sedona.global.index", "true")
    SedonaSQLRegistrator.registerAll(spark)  
    SedonaVizRegistrator.registerAll(spark)
    
  4. 并行读取PG数据

    val pgSourceDF = spark.read.format("jdbc").option("url", "jdbc:postgresql://[ip]:[port]/[database]?user=[user]&password=[password]").option("dbtable","[table]").option("numPartitions", [分多少task去读,我设置的1200,决定了你后面空间分析的效率]).option("partitionColumn","pid").option("lowerBound",1L).option("upperBound",[你最后一行数据的PID]).option("fetchSize",10000).load()
    pgSourceDF.createOrReplaceTempView("pgsource")
    
  5. 因为从PG读来的Geom是WKB字段,我们需要在利用Sedona的SQL函数转换Geom字段

    val pgSourceMapDF = spark.sql("select pid, st_geomfromwkb(geom) as geom from pgsource") 
    pgSourceMapDF.createOrReplaceTempView("pgsource")
    
  6. 利用Sedona的SQL函数进行叠加分析(这里做了一个自己和自己叠加)

    val joinDF = spark.sql("select count(*) from pgsource as left, pgsource as right where st_intersects(left.geom, right.geom)")
    joinDF.count
    

    OK了,到了这里,其实叠加主要代码就实现了,后面大家可以根据自己需要进行分析。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容