Java版GeoMesa-HBase操作——数据插入和读取Demo

前言

完成geoMesa的安装之后,本人尝试使用java完成hbase的表创建、数据插入和读取工作。在这个过程中遇到了很多问题,查了很多资料,试了很多方法,终于实现了。其实出现这些问题都是没有导入正确jar包的原因。这里需要特别强调下,geoMesa和geotool的版本是对应的,是对应的,是对应的,重要的事情说三遍。关于版本对应问题,参考官网的pom文件。
https://github.com/locationtech/geomesa/blob/2.0.x/pom.xml

代码

XML文件

<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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>cn.fr</groupId>
  <artifactId>geomesa5</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>geomesa</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <geotools.version>20.0</geotools.version>
    <hbase.version>1.3.5</hbase.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
    <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-main</artifactId>
            <version>${geotools.version}</version>
    </dependency>
    <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-api</artifactId>
            <version>${geotools.version}</version>
    </dependency>
    <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-cql</artifactId>
            <version>23.0</version>
    </dependency>
    <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-grid</artifactId>
            <version>23.0</version>
    </dependency>
    
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-render</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-data</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        
        <!--// https://mvnrepository.com/artifact/org.locationtech.geomesa/geomesa-hbase-datastore-->
        <dependency>
            <groupId>org.locationtech.geomesa</groupId>
            <artifactId>geomesa-hbase-datastore_2.11</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-protocol</artifactId>
            <version>${hbase.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>${hbase.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-common</artifactId>
            <version>${hbase.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>${hbase.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-annotations</artifactId>
            <version>${hbase.version}</version>
            <scope>runtime</scope>
        </dependency>
  </dependencies>
  <repositories>
        <repository>
            <id>osgeo</id>
            <name>Open Source Geospatial Foundation Repository</name>
            <url>http://download.osgeo.org/webdav/geotools/</url>
        </repository>
    </repositories>
</project>

创建表并写入数据

package cn.fr.geomesa5;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureWriter;
import org.geotools.data.Transaction;
import org.geotools.factory.Hints;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.filter.identity.FeatureIdImpl;
import org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
 


public class IODemo01 {
	/** 
     * 这个方法主要设定了表名"index-text02", 
     * 和schema结构"taxiId:String,dtg:Date,*geom:Point:srid=4326" 
     * @return SimpleFeatureType,即建表的schema表结构 
     */  
    public SimpleFeatureType getSimpleFeatureType() {  
        SimpleFeatureType sft = SimpleFeatureTypes.createType("index-text02", "taxiId:String,dtg:Date,*geom:Point:srid=4326,description:String");  
        //sft.getUserData().put(SimpleFeatureTypes.DEFAULT_DATE_KEY, "dtg"); 
        //设置xz3索引时间间隔为天
        sft.getUserData().put("geomesa.xz3.interval", "day");
        //设置时空索引时间字段为date
        sft.getUserData().put("geomesa.index.dtg", "dateAttr");
        //设置索引精度
        sft.getUserData().put("geomesa.xz.precision", 10);
        return sft;  
    }  
 
    public static void main(String[] args) {  
        Map<String, String> params = new HashMap<String,String>();  
        IODemo01 demo01 = new IODemo01();  
  
        try {  
            //创建datastore  
            params.put("hbase.catalog", "demo");  
            params.put("hbase.zookeepers", "localhost");
            DataStore datastore = DataStoreFinder.getDataStore(params);
  
            // 创建schema  
            SimpleFeatureType sft = demo01.getSimpleFeatureType();  
            System.out.println(sft);  
            //sft.getUserData().put("geomesa.mixed.geometries",Boolean.parseBoolean(true));
            System.out.println(datastore);  
            datastore.createSchema(sft);  
  
            //获取Features  
            SimpleFeature feature = demo01.getData();  
  
            //写入Features  
            demo01.writeFeature(datastore, sft, feature);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
    }  
  
    /** 
     * 这个方法主要用来将封装好的feature存入到对应的datastore中 
     * @param datastore 数据源,可以选择的有很多,此处是HBaseDataStore 
     * @param sft 表结构 
     * @param feature 封装好的一行数据 
     */  
    private void writeFeature(DataStore datastore, SimpleFeatureType sft, SimpleFeature feature) {  
        try {  
            System.out.println("write test data");  
            FeatureWriter<SimpleFeatureType, SimpleFeature> writer =  
                    datastore.getFeatureWriterAppend(sft.getTypeName(), Transaction.AUTO_COMMIT);  
            SimpleFeature toWrite = writer.next();  
            toWrite.setAttributes(feature.getAttributes());  
            ((FeatureIdImpl) toWrite.getIdentifier()).setID(feature.getID());  
            toWrite.getUserData().put(Hints.USE_PROVIDED_FID, Boolean.TRUE);  
            toWrite.getUserData().putAll(feature.getUserData());  
            writer.write();  
            // 关闭流  
            writer.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
 
    }  
  
    /** 
     * 这个方法主要是将非结构化的数据转换为feature对象 
     * @return feature对象 
     */  
    private SimpleFeature getData() {  
        SimpleFeatureBuilder builder = new SimpleFeatureBuilder(getSimpleFeatureType());  
        DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US);  
        builder.set("taxiId", "黑A SA2342");  
        builder.set("dtg", Date.from(LocalDateTime.parse("2008-02-02 13:30:49", dateFormat).toInstant(ZoneOffset.UTC)));  
        builder.set("geom", "POINT (116.31412 39.89454)");  
        builder.set("description", "这是一辆套牌车");  
        builder.featureUserData(Hints.USE_PROVIDED_FID, Boolean.TRUE);  
        return builder.buildFeature("黑A SA2342");  
    }  

}

读取数据

package cn.fr.geomesa5;

import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.opengis.feature.Property;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.feature.type.AttributeDescriptor;

import java.io.IOException;
import java.util.*;

/**
 * @author
 * @DesktopJavaDocable disable
 */
public class DataStoreHbaseDemo {

    private static String catalog = "demo";
    //集群
    private static String zookeepers = "localhost";

    private  Map getParams() {
        Map params = new HashMap();
        params.put("hbase.zookeepers", zookeepers);
        params.put("hbase.catalog", catalog);
        return params;
    }

    public void printfHbase() {
        try {
            DataStore dataStore = DataStoreFinder.getDataStore(getParams());
            System.out.println(dataStore);
            if (dataStore != null) {
                //获取Catalog下所有的数据表
                String[] typeNames = dataStore.getTypeNames();
                if (typeNames.length > 0) {
                    //获取第一张数据表的数据信息
                    SimpleFeatureSource featureSource = dataStore.getFeatureSource(typeNames[0]);
                    if (featureSource != null) {
                        //获取该数据表的属性信息
                        SimpleFeatureType featureType = featureSource.getSchema();
                        System.out.println("表名:" + featureType.getTypeName());
                        System.out.println("字段数:" + featureType.getAttributeCount());
                        //获取数据表的属性(字段)结构
                        List<AttributeDescriptor> attributeDescriptors = featureType.getAttributeDescriptors();
                        for (AttributeDescriptor attributeDescriptor : attributeDescriptors) {
                            System.out.println("字段名:" + attributeDescriptor.getLocalName());
                        }
                        //获取数据表的记录信息
                        SimpleFeatureCollection features = featureSource.getFeatures();
                        SimpleFeatureIterator featureIterator = features.features();
                        //打印前10条记录
                        int counter = 0;
                        while (featureIterator.hasNext()) {
                            //一条记录集
                            SimpleFeature simpleFeature = featureIterator.next();
                            //获取记录集信息
                            Collection<Property> properties = simpleFeature.getProperties();
                            Iterator<Property> iterator = properties.iterator();
                            while (iterator.hasNext()) {
                                Property property = iterator.next();
                                System.out.println(property.getName().getLocalPart() + ":" + property.getValue().toString());
                            }
                            if (counter > 10) {
                                break;
                            }
                            counter++;
                        }

                    }
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   public static void main(String[] args) {
	DataStoreHbaseDemo dataStoreHbaseDemo = new DataStoreHbaseDemo();
	dataStoreHbaseDemo.printfHbase();
}
}

代码参考网址:
1、https://blog.csdn.net/weixin_41834634/article/details/89184113?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
2、https://www.cnblogs.com/mohanchen/p/10827878.html

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Geomesa可以很方便地集成HBase和Spark,实现对HBase的读写操作。具体步骤如下: 1. 首先需要在HBase中创建,可以使用HBase shell或者HBase API进行创建。 2. 在Spark中引入Geomesa的依赖,可以使用Maven或者SBT进行引入。 3. 使用Geomesa提供的HBaseDataStoreFactory创建HBaseDataStore对象,连接到HBase中的。 4. 使用Spark的API读取HBase中的数据,可以使用RDD或者DataFrame进行读取。 5. 使用Geomesa提供的HBaseFeatureWriter将数据写入到HBase中。 需要注意的是,在使用Geomesa进行读写HBase时,需要使用Geomesa提供的SimpleFeature类型进行操作。同时,需要在HBase中创建相应的列族和列,以存储SimpleFeature对象的属性值。 ### 回答2: Geomesa是一个基于地理空间数据管理和分析的开源工具。它集成了HBase和Spark,可以实现读写HBase的功能。 在Geomesa中,HBase作为数据存储和查询的主要工具,Spark则用于并行计算和数据处理。通过这种方式,HBase可以实现大规模的数据存储和高效的数据查询,而Spark可以进行并行计算和数据处理,提高数据分析的效率。 在使用Geomesa集成HBase和Spark进行读写HBase的时候,需要进行以下操作: 1. 配置HBase和Spark的环境:为了保证Geomesa正常运作,需要正确配置HBase和Spark的环境。具体的配置方式可以参考Geomesa的官方文档。 2. 读写HBase数据:通过Geomesa的API,可以实现对HBase数据的读写操作。其中,读操作可以通过Scan类进行,而写操作可以通过Put和Delete类进行。 3. 创建和管理数据:在Geomesa中,可以通过SimpleFeatureType类来定义数据结构,并且可以使用Spark和HBase的API来实现数据的创建和管理。 4. 进行空间查询和空间分析:Geomesa支持空间查询和空间分析的功能,可以通过Spark和HBase的API来实现。 以上就是使用Geomesa集成HBase和Spark进行读写HBase的基本操作流程。通过这种方式,可以实现高效、灵活、可扩展的地理空间数据处理和分析,为地理信息系统的应用提供了强有力的支持。 ### 回答3: geomesa是一个基于Apache Spark和Apache Accumulo的开源地理空间数据分析框架。它提供了丰富的地理空间分析功能,并支持海量地理数据的处理。随着geomesa社区的发展,它也开始支持其他的后端存储引擎,例如HBasegeomesa集成HBase和Spark的主要目的是为了在HBase中存储和查询大规模地理数据,并通过Spark进行批量计算和实时分析。这种集成方式可以实现高效的数据处理和快速的响应时间,尤其适用于对海量地理数据进行地理空间分析和挖掘的场景。 在geomesa中使用HBase的过程主要包括以下几个步骤: 1. 安装HBase和Spark 在使用geomesa之前,需要先安装和配置HBase和Spark环境。HBase是一个开源分布式数据库,可以存储和管理大量的结构化数据;Spark是一个快速的大数据处理引擎,可以进行批量计算和实时分析。 2. 安装geomesa geomesa是一个基于Spark和Accumulo的地理空间分析框架,可以在Spark中快速地进行大规模地理数据的处理和分析。安装geomesa的过程很简单,只需要下载并解压缩geomesa的安装文件即可。 3. 创建HBase数据 在使用geomesa之前,需要先在HBase中创建相应的数据。通常情况下,geomesa会为每个创建两个列族,一个是属性列(attributes),用于存储地理对象的属性信息;另一个是空间列(spatial),用于存储地理对象的空间信息。 4. 使用geomesa创建地理数据集 在HBase中创建好数据之后,需要使用geomesa创建相应的地理数据集(SimpleFeatureType)。geomesa提供了多种不同类型的SimpleFeatureType,可以根据实际需求选择相应的类型。 5. 将地理数据写入HBase 将地理数据写入HBase的过程很简单,只需要借助geomesa提供的API即可。geomesa支持将地理数据写入HBase和从HBase读取地理数据。写入数据时,需要指定相应的地理数据集和HBasegeomesa会自动将数据按照指定的格式写入HBase。 6. 从HBase读取地理数据HBase读取地理数据的过程同样也很简单,只需要借助geomesa提供的API即可。读取数据时,需要指定相应的地理数据集和HBasegeomesa会自动从HBase读取数据,并将数据以相应的格式返回。 以上就是geomesa集成HBase和Spark读写HBase的主要步骤,通过这种方式可以实现高效的海量地理数据处理和分析。但在实际应用中,还需要考虑数据安全、性能优化等方面的问题。因此,在使用geomesa时需要根据实际需求进行相应的优化和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值