首页 > 解决方案 > 在 bigquery 中使用 DBSCAN 进行聚类

问题描述

我有一个 Bigquery 表,其中只有一个名为“point”的列。它包含我想使用 BigQuery 中的 ST_CLUSTERDBSCAN 函数进行聚类的位置坐标。

我使用以下查询:

SELECT ST_CLUSTERDBSCAN(point, 2000, 200) OVER () AS cluster_num 
FROM mytable

我收到此错误:

查询执行期间资源超出:无法在分配的内存中执行查询。峰值使用量:限制的 128%。顶级内存消费者:分析 OVER() 子句:97% 其他/未归因:3%

据我了解,这是因为查询是内存密集型的。鉴于我的表包含数百万行,有什么方法可以使用集群我的数据?

标签: google-bigquerybigdatagis

解决方案


BigQuery 中的大多数分析函数目前在单个分片(机器)上运行一个分区,因此分区大小在内存中被限制为大约 1GB 数据大小。在您的查询中,OVER ()意味着没有分区 - 所有数据都在单个分区中运行。

解决方案通常是在一些大粒度上对数据进行分区。例如,如果数据具有一些空间层次结构,您可以按此列进行分区 - 例如 do OVER(PARTITION BY state)。当然,这意味着不会有跨状态的集群,所以结果并不完全相同,但如果有自然集群,这通常是合理的。

如果这种内在层次结构不可用,另一种选择是通过一个简短的 geohash 进行分区(字母很少 - 尽可能多地避免资源超出错误),例如OVER(PARTITION BY st_geohash(point, 2)). 一个不错的选择是S2_CellIDFromPoint(ST_Centroid(geo, level)),请参阅S2 单元大小以选择单元级别。


推荐阅读