增压H3为地理空间分析
2023年1月12日 在bob体育客户端下载平台的博客
在高跟鞋的最初版本H3砖运行时(DBR的支持),我们很高兴与H3分享突破性的性能改进,支持四个额外的表情,和可用性砖的SQL。在这个博客中,您将学习新的表达式,从我们的矢量化柱状实现绩效基准,使用H3和多个方法点包容空间连接。
增压H3性能
当我们在砖(内置H3功能实现AWS|亚洲开发银行|GCP),我们致力于成为一流。最终,这可以归结为有用的api和性能。我们最初的目标旨在改善H3的性能表达式光子至少20%。更令人兴奋的和令人印象深刻的结果。在下面的表格中,我们有分类每个H3表达式功能类别和测量每个函数的性能与使用Java H3库实现的性能(本质上,当导入H3库)你会得到什么。
我们强烈建议使用H3的BIGINT表示细胞id。比较H3细胞IDs H3-based连接使用长整型数字表示更性能相比,使用字符串表示。我们也强烈建议使用H3表达式过载,长整型数字作为输入。此外,H3-based表达式,通常使用的连接,即遍历和谓词表达式,绝对BIGINT-based表达式的运行时性能比基于字符串的几倍。
功能 类别 |
平均 性能 获得 |
表达式 | 提高性能 双输入longlat表达式 WKT, WKB GeoJSON点或polyfill |
|
---|---|---|---|---|
进口 | 1.4倍 | h3_longlatash3 | 1.3倍 | |
h3_longlatash3string | 1.8倍 | |||
h3_pointash3 | 1.7倍 | |||
h3_pointash3string | 1.7倍 | |||
h3_polyfillash3 | 1.2倍 | |||
h3_polyfillash3string | 1.2倍 | |||
h3_try_polyfillash3 | 1.2倍 | |||
h3_try_polyfillash3string | 1.2倍 | |||
提高性能 长整型数字 |
提高性能 字符串 |
|||
出口 | 1.5倍 | h3_boundaryasgeojson | 1.7倍 | 1.6倍 |
h3_boundaryaswkb | 1.1倍 | 1.5倍 | ||
h3_boundaryaswkt | 1.6倍 | 1.6倍 | ||
h3_centerasgeojson | 1.8倍 | 1.9倍 | ||
h3_centeraswkb | 1.3倍 | 1.8倍 | ||
h3_centeraswkt | 1.7倍 | 1.9倍 | ||
转换 | 5.8倍 | h3_h3tostring | 4.2倍 | n /一个 |
h3_stringtoh3 | n /一个 | 7.3倍 | ||
谓词和有效性 | 5.5倍 | h3_ischildof | 1.5倍 | 12.0倍 |
h3_ispentagon | 2.4倍 | 7.2倍 | ||
h3_isvalid | 2.8倍 | 6.3倍 | ||
h3_try_validate | 2.8倍 | 12.0倍 | ||
h3_validate | 2.7倍 | 11.7倍 | ||
接近 | 2.0倍 | h3_distance | 1.9倍 | 2.7倍 |
h3_hexring | 1.2倍 | 3.1倍 | ||
h3_kring | 1.2倍 | 3.0倍 | ||
h3_kringdistances | 1.2倍 | 2.7倍 | ||
遍历 | 6.1倍 | h3_maxchild | 1.5倍 | 9.2倍 |
h3_minchild | 1.4倍 | 9.0倍 | ||
h3_resolution | 1.3倍 | 7.9倍 | ||
h3_tochildren | 9.5倍 | 7.9倍 | ||
h3_toparent | 2.9倍 | 10.8倍 | ||
压实 | 4.5倍 | h3_compact | 1.5倍 | 4.2倍 |
h3_uncompact | 3.7倍 | 8.6倍 |
H3表达式是新砖SQL和运行时的吗?
有四个新的空间分析表达式使用H3, DBR 11.3开始,可以在当前数据砖SQL。前两个,h3_maxchild
和h3_minchild
提供一个有效的方法遍历索引的不同分辨率层次结构。这是一个例子的最小/最大孩子表达在行动(表不包括):
- 点表:包括h3_15作为列H3细胞分辨率15。
- 多边形表:包括h3_15_c与压实列H3细胞(其原始分辨率15)和id列的多边形id。
下面的查询统计每个多边形内点数量:
选择数(*),polygons.id从点,多边形在哪里points.h3_15之间的h3_minchild (polygons.h3_15_c15)和h3_maxchild (polygons.h3_15_c15)集团通过polygons.id
最小/最大孩子表达式允许您操作H3 IDs压实引起细胞多边形,可以作为过滤器可能加速查询。
我们还增加了简单函数索引点数据已经存储在一个通用的几何图形格式:WKT, WKB或GeoJSON。的功能是h3_pointash3
和h3_pointash3string
,并返回H3细胞id为长整型数字或字符串,分别。
与H3近似点包容层次结构
查询模式:单分辨率加入
在一个以前的博客,我们介绍了点包容有或没有H3加入方法。这里我们想简要地考虑如何利用H3的层次结构,从相同的trip_h3
和taxi_zone_h3
表和以下初始查询:
选择/ * +斜(“t”,“pickup_cell”) * /*从trip_h3作为t, taxi_zone_h3在哪里细胞=pickup_cell
我们能够达到1.22 b近似点包容AWS m5d 10日在1.4分钟。4超大工人准备的H3表与旅行皮卡(点)和出租车区(多边形)几何图形分辨率H3 12, z值细胞的性能。
层次查询模式:测试H3父匹配连接
从单一分辨率的查询模式之后,我们可以进一步提高性能相同的集群配置通过添加h3_toparent条款测试之旅和出租车区有一个匹配的H3分辨率8父母之前测试分辨率12平等。包含一个额外的h3_toparent
条款,执行相同的查询,在短短45秒就提高了40% !这是因为在集群上更容易分区的数据分辨率8细胞,这有助于优化查询计划。看到包括笔记本,H3 ToParent离散空间分析更多的;这些查询也可以运行在DBSQL。
选择/ * +斜(“t”,“pickup_cell”) * /*从trip_h3作为t, taxi_zone_h3在哪里——包含父检查性能收益h3_toparent(细胞,8)=pickup_cell_8和细胞=pickup_cell
调用h3_toparent
快,可以即时或预先计算列在你的表。有一些隐藏的注意事项时选择正确的家长。一般的经验法则是选择一个父分辨率或参照最低分辨率时你会得到压实细胞。即使你不是一个紧凑模式后,通知可能有用的信息查询,使用H3的层次结构。
层次查询模式:H3紧凑的加入
在使用h3_polyfillash3
存储和ZORDER多边形单一H3决议与前面的收益率(non-compacted)查询模式最好的整体性能,纽约城的例子中,压实多边形细胞h3_compact
从给定分辨率也可以是有益的。这个操作分析一组细胞找到组提供的孩子,可以减少他们的父母。压实出租车区,从分辨率12,导致手术后10 x更少的细胞。
如上图所示,细胞压实可以显著降低每个多边形细胞的数量。右边的图片是你之前使用后压实和是相同的结果h3_uncompact回到决议12。这意味着h3_uncompact可以安全返回相同的细胞作为输入提供给h3_compact。
作为一个著名的例子的细胞减少、出租车区布卢姆菲尔德/艾默生山在下图最左边从~ 63 k non-compacted决议12细胞(所示蓝色的)降至只有~ 2 k压实细胞(所示红色的)。
压实产生细胞在一系列决议,而不是一个。H3的层次结构是有用的了解每个六边形的父母都有七个孩子(少数细胞有六个孩子),稍微旋转,显示在右边。虽然这将会产生一些呈现空白,尤其是甚至一些奇怪的决议,重要的是要注意准确的逻辑容器- H3是无损的索引上的细胞层次来源于特定的分辨率,如压实。
使用h3_compact特别是为多边形密集和稀疏的领域提供福利,如国家、地区、国家层面的数据。假设你有一个好的多边形ID、爆炸压实细胞和z轴次序得到最好的性能。重要的是要注意,你必须开始用同样的分辨率的数据(在本例中12),否则你将失去逻辑层次控制指数担保和你的结果将不一致:
h3_toparent (< some_cell_10_bad >、8) vs h3_toparent (< some_cell_12_good >, 8)
换句话说,从数据相同的名义H3决议,遍历H3上下层次结构,使用H3遍历函数,数据是安全的和逻辑的名义决议相当于原始数据分辨率名义操作。
总的来说,压实可以导致数量级减少细胞,例如2.5 non-compacted vs 200 k总压实出租车区。这是通过减少大多数决议12细胞决议11 (7 xꜜ)10 (49倍ꜜ),9 (343 xꜜ)和8 (2401 xꜜ)细胞。
如果你尝试在一项决议uncompact < 12(紧凑的分辨率),您将看到类似于下面的错误:
SparkIllegalArgumentException: [H3_INVALID_RESOLUTION_VALUE] H3决议11必须之间的12和15、包容
H3_compact可以应用在你想要存储的好处的工作负载细胞更少,在这种情况下表taxi_zone_h3c_explode
一些的缺点,增加了计算复杂度相对于非紧化查询模式。以下查询完成在2分钟内使用的10个工人集群配置一样在之前的测试中,发现相同的1.22 b的结果。但是,重要的是要理解,附加条款的评价降低约0.5 x 2 x表现相对于非紧化查询运行在低至1.4分钟45秒。所以,必须权衡取舍。
选择/ * +合并(tz)斜(“t”,“pickup_cell”)斜(tz, cell_8) * /*从trip_h3作为t,(选择h3_toparent (c_cell8)作为cell_8, *从taxi_zone_h3c_explode)作为tz在哪里(tz。h3_res =8和t。pickup_cell_8 = tz.cell_8)或(t。pickup_cell_8 = tz.cell_8和h3_ischildof (t。pickup_cell,tz。c_cell))
表taxi_zone_h3c_explode
商店每一个紧凑的多边形细胞,c_cell
每一行:
选择爆炸(h3_compact (h3_polyfillAsH3 (< geom_col >、<决议>))作为c_cell……
查询应用前面的家长模式和紧凑的进一步测试传感器是否一个细胞的孩子h3_ischildof
。你可以看到呈现差距也看到皮卡属于逻辑索引空间仍发现。
层次查询模式:未爆炸的H3紧凑的加入
的使用h3_compact
无疑是获胜的策略,当你想要遵循未爆炸的连接模式,这意味着你不想与每个多边形细胞每一行存储连接表与表上面吗taxi_zone_h3c_explode
,而是想要加入表未爆炸的数据处理管道。
未爆炸的一个特别好的使用模式时,当你处理巧合多边形,比如311服务请求调用涉及很多,经常重叠,独特的事件,而不是一个固定的边界与出租车区等。很容易有成千上万的这些事件在每一个低分辨率H3细胞在纽约曼哈顿像人口最稠密的地区。如果你想独特把成千上万的311事件与数以百万计的出租车皮卡H3细胞,可以快速的行组合体积,也许不必要,成长为数万亿!下面是一个例子数据沿袭在统一目录代表不同的311事件和出租车皮卡表生成支持未爆炸的连接模式。我们看到表来自其他表和(图中未显示)可以点击列理解它们是如何推导。
前3个表的左下角提供血统遵循一个共同的模式处理压实的事件多边形的未爆炸的连接表导出:
event_311_h3c
契约从分辨率12返回细胞决议10 - 12event_311_h3c_explode
爆炸每个紧凑事件细胞(c_cell
)到各自的行中event_311_h3c_min_max
标识cell_10
最小分辨率为每一个紧凑的细胞在311年的事件
从那里,我们生成表cell_unique_keys
事件标识符到一个数组中每组最小压缩分辨率10。在顶部的谱系,我们生成表cell_trips
生成的组标识符出租车皮卡(来自哪里trip_h3
)到一个数组中每个决议12细胞。现在这些都是有效的未爆炸的表的列。这是一个简单的加入,测试传感器单元(12)决议是否活动单元格的父母的孩子(10)决议通过h3_ischildof
:
选择*从cell_trips,cell_unique_keys在哪里——处理纬度/经度0细胞pickup_cell_12<631300000000000000和h3_ischildof (pickup_cell_12 cell_10)
这一条款pickup_cell_12 < 631300000000000000
是独一无二的出租车数据过滤掉一些缺失或错误的地理空间坐标导致细胞外的纽约地区。在上面的查询中,这两个表连接最右侧的谱系表group_pickup_event_311_h3c
维护列皮卡在决议12和数组trip_keys
以及事件决议10和数组的事件unique_keys
。
下面是100 k最活跃的分辨率12出租车小细胞及其相应的分辨率10父母的311事件的强度。这是从上面的表格呈现,只需删除两个数组离开列:pickup_cell_12
,num_trip_keys
,cell_10
,num_unique_keys
。
你有很多不同的选择在应用离散空间分析技术。我们希望这个博客,以前的,证明有用的为你考虑选择最能满足您的需求。这里有一些外卖亮点:
- 根据大小(面积)、复杂性(顶点)你的多边形和你选择的分辨率
h3_polyfillash3
,由此产生的细胞计数未爆炸的数组可能相当大。同时,挑战处理数组数据将增长相对于多边形的数量在你的数据集。因此,考虑polyfill后爆炸。 - 性能可以与另一个实现
h3_toparent
子句的查询。原因是数据更容易分区由低分辨率细胞,检测高分辨率细胞之前,这有助于优化查询计划。 ZORDER
列与爆炸细胞是有效的;否则,你会被另一个字段,用于各种z值在哪里
条款。- 需要注意的pseudo-hierarchical H3的性质和工作共同开始解决保护逻辑索引担保。
- 的使用
h3_compact
有很多好处对于多边形有密集和稀疏的区域,如国家、地区和国家层面的数据。假设你有一个好的多边形ID,您仍然可以很好地压缩细胞和z值这些爆炸。 - 压实也是获胜的策略,当你想要跟随一个未爆炸的模式,但要注意权衡和选择。
接下来是什么?
H3在砖离散空间分析的基础,我们的团队将继续探索如何提高查询效率和表达更加灵活。如果你想尝试H3或为自己试试——是指我们的入门材料(AWS|亚洲开发银行|GCP]。如果你有兴趣更加关注这个博客的例子,您可以参考这些笔记本-NB01: H3 ToParent离散空间分析|NB02: H3紧凑的离散空间分析|NB03:巧合事件离散空间分析。