• 沒有找到結果。

查询语句及Filter UDF

● 根据polygon过滤数据 IN_POLYGON(pointList) UDF输入参数:

参数 类型 说明

pointList String 将多个点输入为一个字符串,每个点 以longitude latitude表示。经纬度间 用空格分隔,每对经纬度用逗号分 隔,字符串首尾经纬度一致。

UDF输出参数:

参数 类型 说明

inOrNot Boolean 判断数据是否在指定的polygon_list之 内。

使用示例:

select longitude, latitude from geosot where IN_POLYGON('116.321011 40.123503, 116.137676 39.947911, 116.560993 39.935276, 116.321011 40.123503');

● 根据polygon列表过滤数据。

IN_POLYGON_LIST(polygonList, opType) UDF输入参数:

参数 类型 说明

polygonList String 将多个polygon输入为一个字符串,每 个polygon以POLYGON ((longitude1 latitude1, longitude2 latitude2,

…))表示。注意“POLYGON”后有空 格,经纬度间用空格分隔,每对经纬 度用逗号分隔,一个polygon的首尾经 纬度一致。IN_POLYGON_LIST必须输 入2个以上polygon。

一个polygon示例:

POLYGON ((116.137676 40.163503, 116.137676 39.935276, 116.560993 39.935276, 116.137676 40.163503))

opType String 对多个polygon进行并交差操作。

目前支持的操作类型:

● OR:A U B U C (假设输入了三个 POLYGON,A、B、C)

● AND:A ∩ B ∩ C

UDF输出参数:

参数 类型 说明

inOrNot Boolean 判断数据是否在指定的polygon_list之 内。

使用示例:

select longitude, latitude from geosot where IN_POLYGON_LIST('POLYGON ((120.176433 30.327431,120.171283 30.322245,120.181411 30.314540, 120.190509 30.321653,120.185188 30.329358,120.176433 30.327431)), POLYGON ((120.191603 30.328946,120.184179 30.327465,120.181819 30.321464, 120.190359 30.315388,120.199242 30.324464,120.191603 30.328946))', 'OR');

● 根据polyline列表过滤数据。

IN_POLYLINE_LIST(polylineList, bufferInMeter) UDF输入参数:

参数 类型 说明

polylineList String 将多个polyline输入为一个字符串,每 个polyline以LINESTRING

(longitude1 latitude1, longitude2 latitude2, …)表示。注意

“LINESTRING”后有空格,经纬度间 用空格分隔,每组经纬度用逗号分 隔。

对多个polyline区域内的数据会输出并 集结果。

一个polyline示例:

LINESTRING (116.137676 40.163503,

116.137676 39.935276, 116.260993 39.935276)

bufferInMeter Float polyline的buffer距离,单位为米。末 端使用直角创建缓冲区。

UDF输出参数:

参数 类型 说明

inOrNot Boolean 判断数据是否在指定的polyline_list之 内。

使用示例:

select longitude, latitude from geosot where IN_POLYLINE_LIST('LINESTRING (120.184179 30.327465, 120.191603 30.328946, 120.199242 30.324464, 120.190359 30.315388)', 65);

● 根据GeoId区间列表过滤数据。

IN_POLYGON_RANGE_LIST(polygonRangeList, opType) UDF输入参数:

参数 类型 说明

polygonRangeLis

t String 将多个rangeList输入为一个字符串,

每个rangeList以RANGELIST (startGeoId1 endGeoId1,

startGeoId2 endGeoId2, …)表示。

注意“RANGELIST”后有空格,首尾 GeoId间用空格分隔,每组GeoId range用逗号分隔。

一个rangeList示例:

RANGELIST (855279368848 855279368850, 855280799610 855280799612, 855282156300 855282157400)

参数 类型 说明

opType String 对多个rangeList进行并交差操作。

目前支持的操作类型:

● OR:A U B U C (假设输入了三个 RANGELIST,A、B、C)

● AND:A ∩ B ∩ C

UDF输出参数:

参数 类型 说明

inOrNot Boolean 判断数据是否在指定的polyRange_list 之内。

使用示例:

select mygeosot, longitude, latitude from geosot where IN_POLYGON_RANGE_LIST('RANGELIST (526549722865860608 526549722865860618, 532555655580483584 532555655580483594)', 'OR');

● polygon连接查询

IN_POLYGON_JOIN(GEO_HASH_INDEX_COLUMN, POLYGON_COLUMN) 两张表做join查询,一张表为空间数据表(有经纬度列和GeoHashIndex列),另 一张表为维度表,保存polygon数据。

查询使用IN_POLYGON_JOIN UDF,参数GEO_HASH_INDEX_COLUMN和 polygon表的POLYGON_COLUMN。Polygon_column列是一系列的点(经纬度 列)。Polygon表的每一行的第一个点和最后一个点必须是相同的。Polygon表的 每一行的所有点连接起来形成一个封闭的几何对象。

UDF输入参数:

参数 类型 说明

GEO_HASH_IND

EX_COLUMN Long 空间数据表的GeoHashIndex列。

POLYGON_COLU

MN String Polygon表的polygon列,数据为 polygon的字符串表示。例如,一个 polygon是POLYGON ((longitude1 latitude1, longitude2 latitude2, …))

使用示例:

CREATE TABLE polygonTable(

polygon string, poiType string, poiId String)

STORED AS carbondata;

insert into polygonTable select 'POLYGON ((120.176433 30.327431,120.171283 30.322245,

120.181411 30.314540,120.190509 30.321653,120.185188 30.329358,120.176433 30.327431))','abc','1';

insert into polygonTable select 'POLYGON ((120.191603 30.328946,120.184179 30.327465,

120.181819 30.321464,120.190359 30.315388,120.199242 30.324464,120.191603 30.328946))','abc','2';

select t1.longitude,t1.latitude from geosot t1 inner join

(select polygon,poiId from polygonTable where poitype='abc') t2

on in_polygon_join(t1.mygeosot,t2.polygon) group by t1.longitude,t1.latitude;

● range_list连接查询

IN_POLYGON_JOIN_RANGE_LIST(GEO_HASH_INDEX_COLUMN, POLYGON_COLUMN)

同IN_POLYGON_JOIN,使用IN_POLYGON_JOIN_RANGE_LIST UDF关联空间数 据表和polygon维度表,关联基于Polygon_RangeList。直接使用range list可以避 免polygon到range list的转换。

UDF输入参数:

参数 类型 说明

GEO_HASH_IND

EX_COLUMN Long 空间数据表的GeoHashIndex列。

POLYGON_COLU

MN String Polygon表的rangelist列,数据为 rangeList的字符串。例如,一个 rangelist是RANGELIST (startGeoId1 endGeoId1, startGeoId2 endGeoId2,

…)

使用示例:

CREATE TABLE polygonTable(

polygon string, poiType string, poiId String)

STORED AS carbondata;

insert into polygonTable select 'RANGELIST (526546455897309184 526546455897309284,

526549831217315840 526549831217315850, 532555655580483534 532555655580483584)','xyz','2';

select t1.*

from geosot t1 inner join

(select polygon,poiId from polygonTable where poitype='xyz') t2 on in_polygon_join_range_list(t1.mygeosot,t2.polygon);

空间索引工具类UDF

● GeoID转栅格行列号。

GeoIdToGridXy(geoId) UDF输入参数:

参数 类型 说明

geoId Long 根据GeoId计算栅格行列号。

UDF输出参数:

参数 类型 说明

gridArray Array[Int] 返回该geoid所包含的栅格行列号,以 数组的方式返回,第一位为行,第二 位为列。

使用示例:

select longitude, latitude, mygeohash, GeoIdToGridXy(mygeohash) as GridXY from geoTable;

● 经纬度转GeoID。

LatLngToGeoId(latitude, longitude oriLatitude, gridSize) UDF输入参数:

参数 类型 说明

longitude Long 经度,注:转换后的整数类型。

latitude Long 纬度,注:转换后的整数类型。

oriLatitude Double 原点纬度,计算GeoId需要参数。

gridSize Int 栅格大小,计算GeoId需要参数。

UDF输出参数:

参数 类型 说明

geoId Long 通过编码获得一个表示经纬度的数。

使用示例:

select longitude, latitude, mygeohash, LatLngToGeoId(latitude, longitude, 39.832277, 50) as geoId from geoTable;

● GeoID转经纬度。

GeoIdToLatLng(geoId, oriLatitude, gridSize) UDF输入参数:

参数 类型 说明

geoId Long 根据GeoId计算经纬度。

oriLatitude Double 原点纬度,计算经纬度需要参数。

gridSize Int 栅格大小,计算经纬度需要参数。

说明

由于GeoId由栅格坐标生成,坐标为栅格中心点,则计算出的经纬度是栅格中心点经纬 度,与生成该GeoId的经纬度可能有[0度~半个栅格度数]的误差。

UDF输出参数:

参数 类型 说明

latitudeAndLongi

tude Array[Double] 返回该geoid所表示的栅格的中心点的 经纬度坐标,以数组的方式返回,第 一位为latitude,第二位为longitude。

使用示例:

select longitude, latitude, mygeohash, GeoIdToLatLng(mygeohash, 39.832277, 50) as LatitudeAndLongitude from geoTable;

● 计算金字塔模型向上汇聚一层的GeoID。

ToUpperLayerGeoId(geoId) UDF输入参数:

参数 类型 说明

geoId Long 根据输入GeoId计算金字塔模型上一层

GeoId。

UDF输出参数:

参数 类型 说明

geoId Long 金字塔模型上一层GeoId。

使用示例:

select longitude, latitude, mygeohash, ToUpperLayerGeoId(mygeohash) as upperLayerGeoId from geoTable;

● 输入polygon获得GeoID范围列表。

ToRangeList(polygon, oriLatitude, gridSize) UDF输入参数:

参数 类型 说明

polygon String 输入polygon字符串,用一组经纬度表 示。

经纬度间用空格分隔,每对经纬度间 用逗号分隔,首尾经纬度一致。

oriLatitude Double 原点纬度,计算GeoId需要参数。

gridSize Int 栅格大小,计算GeoId需要参数。

UDF输出参数:

参数 类型 说明

geoIdList Buffer[Array[Lon

g]] 将polygon转换为一串geoid的范围列 表。

使用示例:

select ToRangeList('116.321011 40.123503, 116.137676 39.947911, 116.560993 39.935276, 116.321011 40.123503', 39.832277, 50) as rangeList from geoTable;

● 计算金字塔模型向上汇聚一层的longitude。

ToUpperLongitude (longitude, gridSize, oriLat) UDF输入参数:

参数 类型 说明

longitude Long 输入longitude,用一个长整型表示。

gridSize Int 栅格大小,计算longitude需要参数。

oriLatitude Double 原点纬度,计算longitude需要参数。

UDF输出参数:

参数 类型 说明

longitude Long 返回上一层的longitude。

使用示例:

select ToUpperLongitude (-23575161504L, 50, 39.832277) as upperLongitude from geoTable;

● 计算金字塔模型向上汇聚一层的Latitude。

ToUpperLatitude(Latitude, gridSize, oriLat) UDF输入参数:

参数 类型 说明

latitude Long 输入latitude,用一个长整型表示。

gridSize Int 栅格大小,计算latitude需要参数。

oriLatitude Double 原点纬度,计算latitude需要参数。

UDF输出参数:

参数 类型 说明

Latitude Long 返回上一层的latitude。

使用示例:

select ToUpperLatitude (-23575161504L, 50, 39.832277) as upperLatitude from geoTable;

● 经纬度转GeoSOT

LatLngToGridCode(latitude, longitude, level) UDF输入参数:

参数 类型 说明

latitude Double 输入latitude。

longitude Double 输入longitude。

level Int 输入level,值区间[0-32]。

UDF输出参数:

参数 类型 说明

geoId Long 通过GeoSOT编码获得一个表示经纬度

的数。

使用示例:

select LatLngToGridCode(39.930753, 116.302895, 21) as geoId;

3.7 CarbonData 故障处理

3.7.1 当在 Filter 中使用 Big Double 类型数值时,过滤结果与 Hive

不一致