数据集SQL查询

使用说明

数据集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。