2.2. datastore-kudu-spark使用说明

## datastore-kudu-spark介绍: datastore-kudu-spark.jar包提供一种spark读取kudu-datastore的数据的方式。Datastore-kudu.jar和datastore-kudu-spark都封装在sdk里面。Datastore-kudu-spark核心思想: 传入一个geometry filter字符串,获得对应kudu表的查询计划,将查询计划中的keyRanges列表划分为一个一个hadoop的inputSplits, 每一个inputSplits对应一个map, 在map中,反序列化KuduScanner, 用KuduScanner.scan方法读出datastore里面数据。

平台数据存储在kudu中,如果有进行读取和计算的需要,可以使用该工具包内提供将kudu数据转成SpatialRDD的方式。转成SpatialRDD之后,可以根据自己的具体需求对RDD进行操作。本文档会提供几个转换方式提供参考。

该包内SparkDatastoreReader提供读取datastore数据的接口,用typeName和filter字符串实例化SparkDatastoreReader,传入kudu的master和catalog等相关参数,调用read方法即可返回一个RDD。

该包还提供2个属性可以认为设置分区数,spark.datastore.map.nums可以设置map的个数,由于计算inputSplits个数时,时通过kudu的tablets计算的,真实分区数为nums * tablets个数; spark.datastore.map.nums.enabled设置为false时,不能认为设置分区个数。默认可以人为设置分区。

# 创建一个SpatialRDD

public static void main(String[] args) {
    if (args.length != 2) {
        System.out.print("SparkDataStoreReader <typeName> <filter>");
        System.exit(1);
    }

    SparkDatastoreReader reader = new SparkDatastoreReader(args[0], args[1]);
    Map<String, String> params = new HashMap<>();
    params.put("kudu.master", "192.168.20.11:7051");
    params.put("kudu.catalog", "catalog");
    //创建一个SpatialRDD
    SpatialRDD rdd = reader.read(params);
    rdd.collect();

}

* ## <font color=green>java调用方式</font> * ## 将SpatialRDD转成JavaRDD ` java JavaRDD<SimpleFeature> javaSpatialRDD = SpatialRDD.toJavaRdd(SpatialRDD spatialRDD); ` <font color=red>说明:下面的java转化方式,都必须建立在先将SpatialRDD转为JavaRDD的基础上</font>

## 将SpatialRDD转成GeoJson ` java JavaRDD<String> geoJson = SpatialRDD.toGeoJson(JavaRDD<SimpleFeature> javaSpatialRDD); `

## 将JavaSpatialRDD转成Map ` java JavaRDD<String> keyValueMap = SpatialRDD.toKeyValueMap(JavaRDD<SimpleFeature> javaSpatialRDD); `

## 将JavaSpatialRDD转成List ` java JavaRDD<String> valueList = SpatialRDD.toValueList(JavaRDD<SimpleFeature> javaSpatialRDD); `

## 将JavaSpatialRDD转成wkt ` java JavaRDD<String> the_geom_wkt = SpatialRDD.toWKT(JavaRDD<SimpleFeature> javaSpatialRDD); `

## 将JavaSpatialRDD转成Geometry ` java JavaRDD<Geometry> geometry = SpatialRDD.toGeometry(JavaRDD<SimpleFeature> javaSpatialRDD); `