使用说明
数据集SQL查询工具将对要素数据集(FeatureRDD)执行Spark SQL查询。Spark SQL查询不仅可以实对数据的过滤,还可以对数据做复杂的统计和分析,以及可以使用空间操作函数对空间对象进行计算等,并具有较高的操作效率,且操作灵活、便捷。
数据集SQL查询工具是在Spark中执行,即在内存中完成计算,而与数据库无关,同时,这也省去了中间结果的存储,可以提供更加便捷的数据处理能力,适合在复杂在业务流程中使用。
Spark SQL查询能力方面,不仅可以使用Spark SQL原生的查询能力,而且可以使用SuperMap扩展的空间数据操作能力(扩展是基于 Spark SQL 的用户自定义函数。(User-defined Function, UDF),提供一系列满足OGC标准的 OpenGIS Simple Feature访问-SQL规范 的地理空间数据操作UDF函数,这些函数是以st_开头,具体参见文末附表2:地理空间数据操作UDF函数。)
关于如何读取数据为要素数据集(FeatureRDD),请参见矢量数据读写工具部分。
参数说明
参数名 | 默认值 | 参数释义 | 参数类型 |
---|---|---|---|
查询数据集 | 待查询的要素数据集(FeatureRDD)。 | FeatureRDD | |
Spark SQL查询语句 | Spark SQL查询语句,如 select * from viewName where id > 180。有关Spark SQL查询语句的详细示例请参见下文附表1。 | String | |
查询数据集视图别名 (可选) |
待查询的数据集视图别名,用于在Spark SQL查询语句中引用该数据表,如:select * from viewName,其中viewName即为该参数指定的视图别名。 | String | |
关联查询数据集 (可选) |
关联查询要素数据集。 | FeatureRDD | |
关联查询数据集视图别名 (可选) |
关联查询数据集视图别名,用于Spark SQL查询语句中引用该数据表,如:select * from joinViewName,其中joinViewName即为该参数指定的视图别名。 | String | |
扩展关联查询数据集 (可选) |
扩展关联查询要素数据集。 | FeatureRDD | |
扩展关联查询数据集视图别名 (可选) |
扩展关联查询数据集视图别名,用于Spark SQL查询语句中引用该数据表,如:select * from joinExtraViewName,其中joinExtraViewName即为该参数指定的视图别名。 | String |
输出结果
数据集SQL查询工具的输出结果为满足指定查询条件的数据,数据以DataFrame(数据表)形式进行存储。
数据表(DataFrame)是Spark SQL引入的结构化数据存储方式,使我们能使用SQL语句进行分布式数据的读取和计算,DataFrame的底层仍然是RDD。
附表1:Spark SQL 查询语句示例
备注说明:以下查询语句示例中所使用的字段“the_geom”、“smgeometry”、“geom”均为空间数据的几何字段,不同数据库对于空间数据存储的几何字段名称不同,所以要根据实际数据情况填写几何字段的名称。
查询语句示例 | 详细说明 |
---|---|
select dltb.DLMC,starea(dltb.thegeom) as tb_area from dltb where dltb.DLMC=“水田” | 通过过滤获得地类图斑数据中的水田,同时,计算出各水田地块的面积。 |
select dltb.DLMC, SUM(starea(dltb.thegeom)) as sumarea from dltb Group by dltb.DLMC Order by sumarea desc | 按照土地类型分类汇总,计算各土地类型的总面积,并按照面积大小降序显示查询结果。 |
select dltb.QSDWMC, SUM(starea(dltb.thegeom)) as sumarea from dltb where dltb.DLMC=“水田” Group by dltb.QSDWMC Order by sumarea desc | 按照土地行政归属,计算各村水田的总面积,并按照面积大小降序显示查询结果。 |
select dltb.DLMC, COUNT(dltb.DLMC) as tbcount from dltb Group by dltb.DLMC Order by tbcount desc | 计算各土地类型的图斑总数,并按照总数大小降序显示查询结果。 |
select testr.Name from testr where stintersects(testr.thegeom, stmakeBBOX(103, 17, 119,27)) | 查询与指定范围相交的对象。 |
select dbcname,province, starea(ProvinceR.geom) from Airportpt join ProvinceR on Airportpt.Province = ProvinceR.name where starea(ProvinceR.geom)> 300000000000 | 使用行政区域数据与全国机场数据进行关联查询,查询面积大于30万平方千米的行政区以及它所管辖的机场信息。 |
附表2:地理空间数据操作UDF函数
SuperMap 在 Spark SQL 的用户自定义函数(User-defined Function, UDF)基础上,提供了一系列满足OGC标准的 OpenGIS Simple Feature访问-SQL规范 的地理空间数据操作UDF函数,这些函数是以st_开头。
例如下面的 Spark SQL 查询语句中,使用了st_area空间关系函数,计算地类图斑对象的面积,并对不同地类进行分类面积汇总,然后,基于面积汇总结果对查询结果进行降序排序:
Select dltb.DLMC, SUM(starea(dltb.geom)) as sumarea From dltb Group by dltb.DLMC Order by sum_area desc
- 空间关系函数
函数名称 | 函数定义 | 函数说明 |
---|---|---|
st_area | Double st_area(Geometry g) | 如果Geometry g是一个面,则返回这个面的面积,单位为坐标参考系的平方(例如EPSG:4326为度2)。对于非面的geometries(例如Points,非闭合的LineStrings),返回0.0。 |
st_length | Double st_length(Geometry geom) | geom为线时返回2D路径长度,为面时返回周长,以坐标参考系统单位为基准 (例如,EPSG:4236的单位为度)。其他几何类型 (例如Point) 返回0.0。 |
st_lengthSphere | Double st_lengthSphere(LineString line) | 使用球形地球模型,返回LineString 的近似2D路径长度。返回的长度以米为单位。与st_lengthSpheroid的差值在0.3%以内,但计算效率更高。 |
st_lengthSpheroid | Double st_lengthSpheroid(LineString line) | 假设地球为WGS84椭球体,返回LineString的2D路径长度。返回长度以米为单位。 |
st_centroid | Point st_centroid(Geometry g) | 返回g的几何中心。 |
st_closestPoint | Point st_closestPoint(Geometry a, Geometry b) | 返回a上距离b最近的Point,这也是ab最短线上的第一个点。 |
st_contains | Boolean st_contains(Geometry a, Geometry b) | 如果 b中没有点都在a的外部且至少有一个点在a内部 ,则返回true。 |
st_covers | Boolean st_covers(Geometry a, Geometry b) | 如果b中没有点在a之外,则返回true。 |
st_crosses | Boolean st_crosses(Geometry a, Geometry b) | 如果提供的Geometry存在一些相同的内部点,但不是所有的内部点,则返回true。 |
st_disjoint | Boolean st_disjoint(Geometry a, Geometry b) | a, b不相交,则返回true;即它们不共享任意的空间范围,等价于NOT st_intersects(a, b)。 |
st_distance | Double st_distance(Geometry a, Geometry b) | 返回两个geometries 之间的二维笛卡尔距离,单位为坐标参考系(例如EPSG:4326为度)。 |
st_distanceSphere | Double st_distanceSphere(Geometry a, Geometry b) | 假设地球是球型,返回两个经纬度geometries 之间的近似最小距离。 |
st_distanceSpheroid | Double st_distanceSpheroid(Geometry a, Geometry b) | 假设地球为WGS84 椭球体,返回两个geometries 之间的最小距离。 |
st_equals | Boolean st_equals(Geometry a, Geometry b) | 判断两个Geometries 是否逻辑几何相同,不考虑方向。 |
st_intersects | Boolean st_intersects(Geometry a, Geometry b) | 如果两个geometries 在二维空间相交,则返回true。相当于NOT st_disjoint(a, b)。 |
st_overlaps | Boolean st_overlaps(Geometry a, Geometry b) | 如果两个geometries 存在共同点,并且具有相同的维数,并且两个geometries 的交集和geometries 本身的维数相同,则返回 |
true。 | ||
st_relate | String st_relate(Geometry a, Geometry b) | 返回 3x3矩阵,描述两个geometries的内部、边界和外部之间的交集的维数。 |
st_relateBool | Boolean st_relateBool(Geometry a, Geometry b, String mask) | 如果矩阵的掩膜mask和st_relate(a, b)计算的矩阵匹配,则返回true。 |
st_touches | Boolean st_touches(Geometry a, Geometry b) | 如果geometries 至少有一个共同点,但内部不相交,则返回true。 |
st_within | Boolean st_within(Geometry a, Geometry b) | 如果geometry a完全在geometry b中,则返回true。 |
- Geometry 处理
函数名称 | 函数定义 | 函数说明 |
---|---|---|
st_antimeridianSafeGeom | Geometry st_antimeridianSafeGeom(Geometry geom) | 如果geom跨越了180度经线,函数尝试将geom转换被(-180 -90,180 90)内的形态。在某些情况下,此方法可能失败,在这种情况下将返回输入几何图形并记录错误到日志中。 |
st_idlSafeGeom | st_antimeridianSafeGeom.的别名。 | |
st_bufferPoint | Geometry st_bufferPoint(Point p, Double buffer) | 返回一个Geometry ,该Geometry 是点p的缓冲区,其中半径以米为单位。 |
st_convexHull | Geometry st_convexHull(Geometry geom) | 聚合函数。返回包含所有在聚合行中的geom的最小凸包。 |
- Geometry 输出
函数名称 | 函数定义 | 函数说明 |
---|---|---|
st_asBinary | Array[Byte] st_asBinary(Geometry geom) | 返回WKB表示的几何geom。 |
st_asGeoJSON | String st_asGeoJSON(Geometry geom) | 返回GeoJSON表示的几何geom。 |
st_asLatLonText | String st_asLatLonText(Point p) | 返回一个字符串,该字符串以度、分和秒(degrees, minutes, and seconds)为单位描述点p的经纬度。(假设p的坐标系是经纬度 |
坐标系)。 | ||
st_asText | String st_asText(Geometry geom) | 返回WKT表示的几何geom。 |
st_geoHash | String st_geoHash(Geometry geom, Int prec) | 返回几何geom内部点的Geohash字符串(以base-32表示)。 |
- Geometry编辑器
函数名称 | 函数定义 | 函数说明 |
---|---|---|
sttranslatesttranslate | Geometry st_translate(Geometry geom, Double deltaX, Double deltaY) | 返回依据deltaX和deltaY,从geom进行转换所生成的Geometry 图形。 |
- Geometry转换
函数名称 | 函数定义 | 函数说明 |
---|---|---|
st_castToLineString | LineString st_castToLineString(Geometry g) | 将Geometry 类型的g转成LineString。 |
st_castToPoint | Point st_castToPoint(Geometry g) | 将Geometry 类型的g转成point。 |
st_castToPolygon | Polygon st_castToPolygon(Geometry g) | 将Geometry 类型的g转成Polygon。 |
st_castToGeometry | Geometry st_castToGeometry(Geometry g) | 将几何子类g强制转换为Geometry。这个函数可以用在:例如,将st_makePoint的输出保存成一个Geometry用于后续计算。 |
st_byteArray | Array[Byte] st_byteArray(String s) | 使用UTF-8字符集将字符串s编码为字节数组。 |
- Geometry 访问
函数名称 | 函数定义 | 函数说明 |
---|---|---|
st_boundary | Geometry st_boundary(Geometry geom) | 返回geom的边界,如果geom为空则返回适当维度的空geometry 。 |
st_coordDim | Int st_coordDim(Geometry geom) | 返回几何坐标geom的维数。 |
st_dimension | Int st_dimension(Geometry geom) | 返回此几何对象geom的固有维数,该维数必须小于或等于坐标维数。 |
st_envelope | Geometry st_envelope(Geometry geom) | 返回表示geom边界框的Geometry。 |
st_exteriorRing | LineString st_exteriorRing(Geometry geom) | 返回表示geom外圈的LineString ;如果geom不是Polygon,则返回null。 |
st_geometryN | Int st_geometryN(Geometry geom, Int n) | 返回geom的第n个Geometry (从1开始) 如果该geom是一个GeometryCollection;如果不是,则直接返回geom。 |
st_interiorRingN | Int st_interiorRingN(Geometry geom, Int n) | 返回Polygon 类型geom的第n个内部LineString 环。如果geometry 不是Polygon 或给定的n超出范围,则返回null。 |
st_isClosed | Boolean st_isClosed(Geometry geom) | 如果geom是一个LineString或MultiLineString,并且它的起点和终点是重合的,则返回true。对所有其他Geometry返回false。 |
st_isCollection | Boolean st_isCollection(Geometry geom) | 如果geom是一个GeometryCollection,则返回true。 |
st_isEmpty | Boolean st_isEmpty(Geometry geom) | 如果geom为空,则返回true。 |
st_isRing | Boolean st_isRing(Geometry geom) | 如果geom是一个LineString或一个MultiLineString,并且是封闭且简单的,则返回true。 |
st_isSimple | Boolean st_isSimple(Geometry geom) | 如果geom没有异常的几何点,如自相交或自相切,则返回true。 |
st_isValid | Boolean st_isValid(Geometry geom) | 如果geom根据OGC SFS规范在拓扑上有效,则返回true。 |
st_numGeometries | Int st_numGeometries(Geometry geom) | 如果geom是GeometryCollection,则返回geometries的数量。对于单个Geometry,返回1。 |
st_numPoints | Int st_numPoints(Geometry geom) | 返回几何图形geom中的顶点数。 |
st_pointN | Point st_pointN(Geometry geom, Int n) | 如果geom是一个LineString,则以Point类型返回geom的第n个顶点。n为负值时从LineString的末尾逆向计数。如果geom不是一个 |
LineString,则返回null。 | ||
st_x | Float st_x(Geometry geom) | 如果geom是一个点,返回该点的X坐标。 |
st_y | Float st_y(Geometry geom) | 如果geom是一个点,返回该点的Y坐标。 |
- Geometry 构造
函数名称 | 函数定义 | 函数说明 |
---|---|---|
st_geomFromGeoHash | Geometry st_geomFromGeoHash(String geohash, Int prec) | 返回与Geohash字符串(base-32编码)对应的边界框的Geometry,其精度为prec位。 |
st_box2DFromGeoHash | Geometry st_box2DFromGeoHash(String geohash, Int prec) | st_geomFromGeoHash的别名。 |
st_geomFromText | Geometry st_geomFromText(String wkt) | st_geomFromWKT的别名。 |
st_geomFromWKB | Geometry st_geomFromWKB(Array[Byte] wkb) | 根据给定的WKB创建几何图形Geometry。 |
st_geomFromWKT | Geometry st_geomFromWKT(String wkt) | 根据给定的WKT创建几何图形Geometry。 |
st_geometryFromText | Geometry st_geometryFromText(String wkt) | st_geomFromWKT的别名。 |
st_lineFromText | LineString st_lineFromText(String wkt) | 根据给定的WKT表示创建一个LineString。 |
st_mLineFromText | MultiLineString st_mLineFromText(String wkt) | 根据WKT创建MultiLineString。 |
st_mPointFromText | MultiPoint st_mPointFromText(String wkt) | 根据WKT创建MultiPoint。 |
st_mPolyFromText | MultiPolygon st_mPolyFromText(String wkt) | 根据WKT创建MultiPolygon。 |
st_makeBBOX | Geometry st_makeBBOX(Double lowerX, Double lowerY, Double upperX, Double upperY) | 根据给定边界框创建Geometry。 |
st_makeBox2D | Geometry st_makeBox2D(Point lowerLeft, Point upperRight) | 根据两个点创建一个Geometry。 |
st_makeLine | LineString st_makeLine(Seq[Point] points) | 根据一个点的集合创建一条LineString。 |
st_makePoint | Point st_makePoint(Double x, Double y) | 根据两个double值创建一个point。 |
st_makePointM | Point st_makePointM(Double x, Double y, Double m) | 根据三个double值创建一个point。 |
st_makePolygon | Polygon st_makePolygon(LineString shell) | 根据一些LineString创建一个Polygon ,这些LineString必须是闭合的。 |
st_point | Point st_point(Double x, Double y) | 根据两个double值创建一个point。是st_makePoint的别名。 |
st_pointFromGeoHash | Point st_pointFromGeoHash(String geohash, Int prec) | 返回由Geohash字符串 (base-32)定义的边界框几何中心的点。 |
st_pointFromText | Point st_pointFromText(String wkt) | 根据WKT创建point。 |
st_pointFromWKB | Point st_pointFromWKB(Array[Byte] wkb) | 根据WKB创建point。 |
st_polygon | Polygon st_polygon(LineString shell) | 根据一些LineString创建一个Polygon ,这些LineString必须是闭合的。 |
st_polygonFromText | Polygon st_polygonFromText(String wkt) | 根据WKT创建Polygon。 |