网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts盘古助手
华为云Astro大屏应用
计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
云手机服务器 CPH
专属主机 DeH
弹性伸缩 AS
镜像服务 IMS
函数工作流 FunctionGraph
云耀云服务器(旧版)
VR云渲游平台 CVR
Huawei Cloud EulerOS
云化数据中心 CloudDC
网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
CDN与智能边缘
内容分发网络 CDN
智能边缘云 IEC
智能边缘平台 IEF
CloudPond云服务
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
可信智能计算服务 TICS
推荐系统 RES
云搜索服务 CSS
数据可视化 DLV
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
湖仓构建 LakeFormation
智能数据洞察 DataArts Insight
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
开天aPaaS
应用平台 AppStage
开天企业工作台 MSSE
开天集成工作台 MSSI
API中心 API Hub
云消息服务 KooMessage
交换数据空间 EDS
云地图服务 KooMap
云手机服务 KooPhone
组织成员账号 OrgID
云空间服务 KooDrive
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
区块链
区块链服务 BCS
数字资产链 DAC
华为云区块链引擎服务 HBS
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
价格
成本优化最佳实践
专属云商业逻辑
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
其他
管理控制台
消息中心
产品价格详情
系统权限
客户关联华为云合作伙伴须知
公共问题
宽限期保留期
奖励推广计划
活动
云服务信任体系能力说明
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts盘古助手
华为云Astro大屏应用
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
存储容灾服务 SDRS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
云存储网关 CSG
专属分布式存储服务 DSS
数据工坊 DWR
地图数据 MapDS
键值存储服务 KVS
容器
云容器引擎 CCE
云容器实例 CCI
容器镜像服务 SWR
云原生服务中心 OSC
应用服务网格 ASM
华为云UCS
数据库
云数据库 RDS
数据复制服务 DRS
文档数据库服务 DDS
分布式数据库中间件 DDM
云数据库 GaussDB
云数据库 GeminiDB
数据管理服务 DAS
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
AI开发平台ModelArts
华为HiLens
图引擎服务 GES
图像识别 Image
文字识别 OCR
自然语言处理 NLP
内容审核 Moderation
图像搜索 ImageSearch
医疗智能体 EIHealth
企业级AI应用开发专业套件 ModelArts Pro
人脸识别服务 FRS
对话机器人服务 CBS
语音交互服务 SIS
人证核身服务 IVS
视频智能分析服务 VIAS
城市智能体
自动驾驶云服务 Octopus
盘古大模型 PanguLargeModels
IoT物联网
设备接入 IoTDA
全球SIM联接 GSL
IoT数据分析 IoTA
路网数字化服务 DRIS
IoT边缘 IoTEdge
设备发放 IoTDP
企业应用
域名注册服务 Domains
云解析服务 DNS
企业门户 EWP
ICP备案
商标注册
华为云WeLink
华为云会议 Meeting
隐私保护通话 PrivateNumber
语音通话 VoiceCall
消息&短信 MSGSMS
云管理网络
SD-WAN 云服务
边缘数据中心管理 EDCM
云桌面 Workspace
应用与数据集成平台 ROMA Connect
ROMA资产中心 ROMA Exchange
API全生命周期管理 ROMA API
政企自服务管理 ESM
视频
实时音视频 SparkRTC
视频直播 Live
视频点播 VOD
媒体处理 MPC
视频接入服务 VIS
数字内容生产线 MetaStudio
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
专属云
专属计算集群 DCC
开发者工具
SDK开发指南
API签名指南
DevStar
华为云命令行工具服务 KooCLI
Huawei Cloud Toolkit
CodeArts API
云化转型
云架构中心
云采用框架
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
客户运营能力
国际站常见问题
支持计划
专业服务
合作伙伴支持计划
我的凭证
华为云公共事业服务云平台
工业软件
工业数字模型驱动引擎
硬件开发工具链平台云服务
工业数据转换引擎云服务

CarbonData表空间索引语法说明

更新时间:2024-11-23 GMT+08:00
分享

快速示例

create table IF NOT EXISTS carbonTable
(
COLUMN1    BIGINT,
LONGITUDE    BIGINT,
LATITUDE    BIGINT,
COLUMN2    BIGINT,
COLUMN3    BIGINT
)
STORED AS carbondata
TBLPROPERTIES ('SPATIAL_INDEX.mygeohash.type'='geohash','SPATIAL_INDEX.mygeohash.sourcecolumns'='longitude, latitude','SPATIAL_INDEX.mygeohash.originLatitude'='39.850713','SPATIAL_INDEX.mygeohash.gridSize'='50','SPATIAL_INDEX.mygeohash.minLongitude'='115.828503','SPATIAL_INDEX.mygeohash.maxLongitude'='720.000000','SPATIAL_INDEX.mygeohash.minLatitude'='39.850713','SPATIAL_INDEX.mygeohash.maxLatitude'='720.000000','SPATIAL_INDEX'='mygeohash','SPATIAL_INDEX.mygeohash.conversionRatio'='1000000','SORT_COLUMNS'='column1,column2,column3,latitude,longitude');

空间索引介绍

空间数据包括多维点、线、矩形、立方体、多边形和其他几何对象。空间数据对象占据空间的某一区域,称为空间范围,通过其位置和边界描述。空间数据可以是点数据,也可以是区域数据。

  • 点数据:一个点具有一个空间范围,仅通过其位置描述。它不占用空间,没有相关的边界。点数据由二维空间中的点的集合组成。点可以存储为一对经纬度。
  • 区域数据:一个区域有空间范围,有位置和边界。位置可以看作是一个定点在区域内的位置,例如它的质心。在二维中,边界可以可视化为一条线(有限区域,闭环)。区域数据包含一系列区域。

目前仅限于支持点数据,存储点数据。

经纬度可以编码为唯一的GeoID。Geohash是Gustavo Niemeyer发明的公共域地理编码系统,它将地理位置编码为一串由字母和数字组成的短字符串。它是一种分层的空间数据结构,把空间细分为网格形状的桶,是被称为Z阶曲线和通常称为空间填充曲线的许多应用之一。

点在多维中的Z值是简单地通过交织其坐标值的二进制表示来计算的,如下图所示。使用Geohash创建GeoID时,数据按照GeoID排序,而不是按照经纬度排序,数据按照空间就近性排序存储。

建表

GeoHash编码:

create table IF NOT EXISTS carbonTable
(
...
`LONGITUDE`     BIGINT,
`LATITUDE`      BIGINT,
...
)
STORED AS carbondata
TBLPROPERTIES ('SPATIAL_INDEX.mygeohash.type'='geohash','SPATIAL_INDEX.mygeohash.sourcecolumns'='longitude, latitude','SPATIAL_INDEX.mygeohash.originLatitude'='xx.xxxxxx','SPATIAL_INDEX.mygeohash.gridSize'='xx','SPATIAL_INDEX.mygeohash.minLongitude'='xxx.xxxxxx','SPATIAL_INDEX.mygeohash.maxLongitude'='xxx.xxxxxx','SPATIAL_INDEX.mygeohash.minLatitude'='xx.xxxxxx','SPATIAL_INDEX.mygeohash.maxLatitude'='xxx.xxxxxx','SPATIAL_INDEX'='mygeohash','SPATIAL_INDEX.mygeohash.conversionRatio'='1000000','SORT_COLUMNS'='column1,column2,column3,latitude,longitude');

SPATIAL_INDEX:自定义索引处理器。此处理程序允许用户从表结构列集合中创建新的列。新创建的列名与处理程序名相同。处理程序的type和sourcecolumns属性是必需的属性。目前,type属性只支持“geohash”。Carbon提供一个简单的默认实现类。用户可以通过扩展默认实现类来挂载geohash的自定义实现类。该默认处理程序还需提供以下的表属性:

  • SPATIAL_INDEX.xxx.originLatitude:Double类型,坐标原点纬度
  • SPATIAL_INDEX.xxx.gridSize:Int类型,栅格长度(米)
  • SPATIAL_INDEX.xxx.minLongitude:Double类型,最小经度
  • SPATIAL_INDEX.xxx.maxLongitude:Double类型,最大经度
  • SPATIAL_INDEX.xxx.minLatitude:Double类型,最小纬度
  • SPATIAL_INDEX.xxx.maxLatitude:Double类型,最大纬度
  • SPATIAL_INDEX.xxx.conversionRatio:Int类型,将经纬度小数值转换为整型值

用户可以按照上述格式为处理程序添加自己的表属性,并在自定义实现类中访问它们。originLatitude,gridSize及conversionRatio是必选参数,其余属性在Carbon中都是可选的。可以使用“SPATIAL_INDEX.xxx.class”属性指定它们的实现类。

默认实现类可以为每一行的sourcecolumns生成handler列值,并且支持基于sourcecolumns的过滤条件查询。生成的handler列对用户不可见。除SORT_COLUMNS表属性外,任何DDL命令和属性都不允许包含handler列。

说明:
  • 生成的handler列默认被视为排序列。如果SORT_COLUMNS不包含任何sourcecolumns,则将handler列追加到现有的SORT_COLUMNS最后。如果在SORT_COLUMNS中已经指定了该handler列,则它在SORT_COLUMNS的顺序将保持不变。
  • 如果SORT_COLUMNS包含任意的sourcecolumns,但是没有包含handler列,则handler列将自动插入到SORT_COLUMNS中的sourcecolumns之前。
  • 如果SORT_COLUMNS需要包含任意的sourcecolumns,那么需要保证handler列出现在sourcecolumns之前,这样handler列才能在排序中生效。

GeoSOT编码:

CREATE TABLE carbontable(
…
longitude DOUBLE,
latitude DOUBLE,
…)
STORED AS carbondata
TBLPROPERTIES ('SPATIAL_INDEX'='xxx',
'SPATIAL_INDEX.xxx.type'='geosot',
'SPATIAL_INDEX.xxx.sourcecolumns'='longitude, latitude',
'SPATIAL_INDEX.xxx.level'='21',
'SPATIAL_INDEX.xxx.class'='org.apache.carbondata.geo.GeoSOTIndex')
表1 参数说明

参数

说明

SPATIAL_INDEX

指定表属性“SPATIAL_INDEX”,空间索引列,列名与该属性的值相同。

SPATIAL_INDEX.xxx.type

必填参数,值为geosot。

SPATIAL_INDEX.xxx.sourcecolumns

必填参数,空间索引列属性,指定计算空间索引的源数据列,需为2个存在的列,且类型为double。

SPATIAL_INDEX.xxx.level

可选参数,用于计算空间索引列。默认值为17,因为该值可以计算出足够精确的结果,同时拥有良好的性能。

SPATIAL_INDEX.xxx.class

可选参数,用于指定geo的实现类,默认为“org.apache.carbondata.geo.GeoSOTIndex”。

使用示例:

create table geosot(
timevalue bigint,
longitude double,
latitude double)
stored as carbondata
TBLPROPERTIES ('SPATIAL_INDEX'='mygeosot',
'SPATIAL_INDEX.mygeosot.type'='geosot',
'SPATIAL_INDEX.mygeosot.level'='21', 'SPATIAL_INDEX.mygeosot.sourcecolumns'='longitude, latitude');

准备数据

  • 准备数据文件1:geosotdata.csv
    timevalue,longitude,latitude
    1575428400000,116.285807,40.084087
    1575428400000,116.372142,40.129503
    1575428400000,116.187332,39.979316
    1575428400000,116.337069,39.951887
    1575428400000,116.359102,40.154684
    1575428400000,116.736367,39.970323
    1575428400000,116.720179,40.009893
    1575428400000,116.346961,40.13355
    1575428400000,116.302895,39.930753
    1575428400000,116.288955,39.999101
    1575428400000,116.17609,40.129953
    1575428400000,116.725575,39.981115
    1575428400000,116.266922,40.179415
    1575428400000,116.353706,40.156483
    1575428400000,116.362699,39.942444
    1575428400000,116.325378,39.963129
  • 准备数据文件2:geosotdata2.csv
    timevalue,longitude,latitude
    1575428400000,120.17708,30.326882
    1575428400000,120.180685,30.326327
    1575428400000,120.184976,30.327105
    1575428400000,120.189311,30.327549
    1575428400000,120.19446,30.329698
    1575428400000,120.186965,30.329133
    1575428400000,120.177481,30.328911
    1575428400000,120.169713,30.325614
    1575428400000,120.164563,30.322243
    1575428400000,120.171558,30.319613
    1575428400000,120.176365,30.320687
    1575428400000,120.179669,30.323688
    1575428400000,120.181001,30.320761
    1575428400000,120.187094,30.32354
    1575428400000,120.193574,30.323651
    1575428400000,120.186192,30.320132
    1575428400000,120.190055,30.317464
    1575428400000,120.195376,30.318094
    1575428400000,120.160786,30.317094
    1575428400000,120.168211,30.318057
    1575428400000,120.173618,30.316612
    1575428400000,120.181001,30.317316
    1575428400000,120.185162,30.315908
    1575428400000,120.192415,30.315871
    1575428400000,120.161902,30.325614
    1575428400000,120.164306,30.328096
    1575428400000,120.197093,30.325985
    1575428400000,120.19602,30.321651
    1575428400000,120.198638,30.32354
    1575428400000,120.165421,30.314834

导入数据

GeoHash默认实现类扩展自定义索引抽象类。如果没有配置handler属性为自定义的实现类,则使用默认的实现类。用户可以通过扩展默认实现类来挂载geohash的自定义实现类。自定义索引抽象类方法包括:

  • Init方法,用来提取、验证和存储handler属性。在失败时发生异常,并显示错误信息。
  • Generate方法,用来生成索引。它为每行数据生成一个索引数据。
  • Query方法,用来对给定输入生成索引值范围列表。

导入命令同普通Carbon表:

LOAD DATA inpath '/tmp/geosotdata.csv' INTO TABLE geosot OPTIONS ('DELIMITER'= ',');

LOAD DATA inpath '/tmp/geosotdata2.csv' INTO TABLE geosot OPTIONS ('DELIMITER'= ',');

说明:

geosotdata.csv和geosotdata2.csv表请参考准备数据

不规则空间集合的聚合查询

查询语句及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输入参数:

    参数

    类型

    说明

    polygonRangeList

    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_INDEX_COLUMN

    Long

    空间数据表的GeoHashIndex列。

    POLYGON_COLUMN

    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_INDEX_COLUMN

    Long

    空间数据表的GeoHashIndex列。

    POLYGON_COLUMN

    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输出参数:

    参数

    类型

    说明

    latitudeAndLongitude

    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[Long]]

    将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;
提示

您即将访问非华为云网站,请注意账号财产安全

文档反馈

文档反馈

意见反馈

0/500

标记内容

同时提交标记内容