package com.grady.geomesa

import org.apache.hadoop.conf.Configuration
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.geotools.data.Query
import org.locationtech.geomesa.spark.{GeoMesaSpark, GeoMesaSparkKryoRegistrator, SpatialRDD}
import org.locationtech.geomesa.spark.jts._ import scala.collection.JavaConversions._ object SparkReadGeomesa { val GeomesaCatalog = "gradytest"
val GeomesaCatalogFeature = "student" def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("SparkReadGeomesa")
// 这里序列化配置非常关键,否则spark解析不出来数据
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.set("spark.kryo.registrator", classOf[GeoMesaSparkKryoRegistrator].getName)
val ss = SparkSession.builder().config(conf).getOrCreate().withJTS // 方法一报错:
// java.lang.ClassNotFoundException: org.locationtech.geomesa.hbase.rpc.filter.CqlTransformFilter
// 可能是环境配置关系
// val dataFrame = readGeomesaData(ss)
// showDataFrame(dataFrame, ss) // 方法二: ok
val spatialRDD = readGeomesaDataToRDD(ss)
showSpatialRDD(spatialRDD) ss.stop()
} /**
* 方法一: 获取dataFrame
* @param ss
* @return
*/
def readGeomesaData(ss: SparkSession): DataFrame = {
val params = Map(
"hbase.zookeepers" -> "10.82.xxx.xx:2181",
"hbase.catalog" -> GeomesaCatalog) val dataFrame = ss.read
.format("geomesa")
.options(params)
.option("geomesa.feature", GeomesaCatalogFeature)
.load()
dataFrame
} def showDataFrame(dataFrame: DataFrame, ss: SparkSession): Unit = {
dataFrame.show()
println("-----------------------------------")
dataFrame.createOrReplaceTempView("student")
val sqlQuery = "select * from student"
val resultDataFrame = ss.sql(sqlQuery)
resultDataFrame.show()
} /**
* 方法二: 获取SpatialRDD
* @param ss
* @return
*/
def readGeomesaDataToRDD(ss: SparkSession): SpatialRDD = {
val params = Map(
"hbase.zookeepers" -> "10.82.xxx.xx:2181",
"hbase.catalog" -> GeomesaCatalog)
val spatialRDDProvider = GeoMesaSpark(params)
val query = new Query(GeomesaCatalogFeature)
val resultRDD = spatialRDDProvider.rdd(new Configuration, ss.sparkContext, params, query)
resultRDD
} def showSpatialRDD(spatialRDD: SpatialRDD): Unit = {
spatialRDD.collect().foreach(row => {
val geom = row.getAttribute("geom").toString
val name = row.getAttribute("name").toString
println("name:" + name + " geom: " + geom)
})
println("-----------------------------------")
spatialRDD.collect().foreach(println)
} }
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spark-practise</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>geomesa</artifactId> <properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<geomesa.version>3.1.0</geomesa.version>
</properties> <dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</dependency> <dependency>
<groupId>org.locationtech.geomesa</groupId>
<artifactId>geomesa-hbase-spark-runtime-hbase2_2.12</artifactId>
<version>3.3.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>org.locationtech.geomesa</groupId>
<artifactId>geomesa-spark-core_2.12</artifactId>
<version>3.3.0</version>
</dependency> <dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-yarn_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
</dependencies> <build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources> <plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<artifactSet>
<excludes>
<exclude>org.slf4j:*</exclude>
</excludes>
</artifactSet>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

运行:spark-submit --master yarn --driver-memory=2G --class com.grady.geomesa.SparkReadGeomesa /app/data/appdeploy/geomesa-1.0-SNAPSHOT.jar

这里最好是在yarn上执行,因为本地执行可能内存不够而卡住,我就被坑了几次

执行日志:(因为多执行了几遍插入,所以有重复数据)
name:jack  geom: POINT (11.1 12.1)
name:Lily geom: POINT (12.1 13.1)
name:jack geom: POINT (11.1 12.1)
name:Lily geom: POINT (12.1 13.1)
name:mike geom: POINT (14.1 15.1)
name:jack geom: POINT (11.1 12.1)
name:Lily geom: POINT (12.1 13.1)
name:mike geom: POINT (14.1 15.1)
name:mike geom: POINT (14.1 15.1)
-----------------------------------
ScalaSimpleFeature:000017ed-e5d1-41f8-ae71-84db58b9478f:POINT (11.1 12.1)|1|jack|15
ScalaSimpleFeature:000017ed-e5d1-41f8-a308-efcee8b70bf9:POINT (12.1 13.1)|2|Lily|16
ScalaSimpleFeature:000017ed-e35c-4d77-a841-b3bcf6faa8ac:POINT (11.1 12.1)|1|jack|15
ScalaSimpleFeature:000017ed-e37a-4e60-9d7f-66988be48234:POINT (12.1 13.1)|2|Lily|16
ScalaSimpleFeature:000017ed-e35c-4e9a-8600-97ed8d92c48b:POINT (14.1 15.1)|3|mike|16
ScalaSimpleFeature:000017ed-e37a-4e60-b90f-93fc81e0ab0e:POINT (11.1 12.1)|1|jack|15
ScalaSimpleFeature:000017ed-e35c-4d77-99e7-c6918a06c008:POINT (12.1 13.1)|2|Lily|16
ScalaSimpleFeature:000017ed-e37a-4ebd-b3a5-a9c7399a635b:POINT (14.1 15.1)|3|mike|16
ScalaSimpleFeature:000017ed-e5d1-4257-a75d-b0e23729542e:POINT (14.1 15.1)|3|mike|16

spark 读取Geomesa(Hbase)数据的更多相关文章

  1. Spark读取结构化数据

    读取结构化数据 Spark可以从本地CSV,HDFS以及Hive读取结构化数据,直接解析为DataFrame,进行后续分析. 读取本地CSV 需要指定一些选项,比如留header,比如指定delimi ...

  2. 大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息

    1 RDD编程实战案例一 数据样例 字段说明: 其中cid中1代表手机,2代表家具,3代表服装 1.1 计算订单分类成交金额 需求:在给定的订单数据,根据订单的分类ID进行聚合,然后管理订单分类名称, ...

  3. Spark:读取mysql数据作为DataFrame

    在日常工作中,有时候需要读取mysql的数据作为DataFrame数据源进行后期的Spark处理,Spark自带了一些方法供我们使用,读取mysql我们可以直接使用表的结构信息,而不需要自己再去定义每 ...

  4. spark读取hbase形成RDD,存入hive或者spark_sql分析

    object SaprkReadHbase { var total:Int = 0 def main(args: Array[String]) { val spark = SparkSession . ...

  5. Spark Streaming接收Kafka数据存储到Hbase

    Spark Streaming接收Kafka数据存储到Hbase fly spark hbase kafka 主要参考了这篇文章https://yq.aliyun.com/articles/60712 ...

  6. SparkSQL读取HBase数据

    这里的SparkSQL是指整合了Hive的spark-sql cli(关于SparkSQL和Hive的整合,见文章后面的参考阅读). 本质上就是通过Hive访问HBase表,具体就是通过hive-hb ...

  7. Spark Streaming实时写入数据到HBase

    一.概述 在实时应用之中,难免会遇到往NoSql数据如HBase中写入数据的情景.题主在工作中遇到如下情景,需要实时查询某个设备ID对应的账号ID数量.踩过的坑也挺多,举其中之一,如一开始选择使用NE ...

  8. 关于mapreducer 读取hbase数据 存入mysql的实现过程

    mapreducer编程模型是一种八股文的代码逻辑,就以用户行为分析求流存率的作为例子 1.map端来说:必须继承hadoop规定好的mapper类:在读取hbase数据时,已经有现成的接口 Tabl ...

  9. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十一)定制一个arvo格式文件发送到kafka的topic,通过Structured Streaming读取kafka的数据

    将arvo格式数据发送到kafka的topic 第一步:定制avro schema: { "type": "record", "name": ...

随机推荐

  1. Python: list列表的11个内置方法

    先来逼逼两句: 在实际开发中,经常需要将一组(不只一个)数据存储起来,以便后边的代码使用.在VBA中有使用数组,可以把多个数据存储到一起,通过数组下标可以访问数组中的每个元素.Python 中没有数组 ...

  2. 数组基础篇(对应C++ Primer plus 4.10)

    概要:数组是由一组同类型的元素组成的集合,在内存上是一片连续的存储空间.C++提供了三种数组的表示方法:普通数组,模板类vector(C++98 新增的标准模板库STL提供该模板类)和模板类array ...

  3. 深入理解Apache Hudi异步索引机制

    在我们之前的文章中,我们讨论了多模式索引的设计,这是一种用于Lakehouse架构的无服务器和高性能索引子系统,以提高查询和写入性能.在这篇博客中,我们讨论了构建如此强大的索引所需的机制,异步索引机制 ...

  4. labview从入门到出家5(进阶篇)--程序调试以及labview函数库的运用

    跟了前面几章的操作流程,相信大家对labview有了一定的认识.其实只要了解了labview的编程思路,再熟悉地运用各个变量,函数以及属性,那么我们就可以打开labview的大门了.跟其他编程语言一样 ...

  5. pop!_OS换国内源

    今天给电脑换源了,虽然本来的源大部分好像也都连的上(不知道是不是错觉)换的这个:阿里云镜像开源站 先进入存放源的目录:` cd /etc/apt 里面有这些文件: sources.list是要修改的, ...

  6. APISpace 绕口令API接口 免费好用

    绕口令又称急口令.吃口令.拗口令等.是一种民间传统的语言游戏 ,由于它是将若干双声.叠韵词或发音相同.相近的语.词有意集中在一起,组成简单.有趣的语韵,要求快速念出,所以读起来使人感到节奏感强,妙趣横 ...

  7. atcoder ABC 232 B~E题解

    B 模拟,水题 #include<bits/stdc++.h> using namespace std; char s1[100005],s2[100005]; int a1[100005 ...

  8. kube-scheduler的调度上下文

    前一章节了解到了kube-scheduler中的概念,该章节则对调度上下文的源码进行分析 Scheduler Scheduler 是整个 kube-scheduler 的一个 structure,提供 ...

  9. CSDN 原力(声望,影响力) -- 设计草案

    目标 CSDN 希望成为开发者学习,成长和成就的平台.我们已经有很多功能来支持开发者的职业成长了, 如何衡量成就呢?我们希望用 原力 (以前也叫 影响力,声望) 来体现用户的成就, 并希望用原力来帮助 ...

  10. Codeforces Round #768 (Div. 2) D. Range and Partition // 思维 + 贪心 + 二分查找

    The link to problem:Problem - D - Codeforces   D. Range and Partition  time limit per test: 2 second ...