google-bigquery - 在 bigquery 中使用 DBSCAN 进行聚类
问题描述
我有一个 Bigquery 表,其中只有一个名为“point”的列。它包含我想使用 BigQuery 中的 ST_CLUSTERDBSCAN 函数进行聚类的位置坐标。
我使用以下查询:
SELECT ST_CLUSTERDBSCAN(point, 2000, 200) OVER () AS cluster_num
FROM mytable
我收到此错误:
查询执行期间资源超出:无法在分配的内存中执行查询。峰值使用量:限制的 128%。顶级内存消费者:分析 OVER() 子句:97% 其他/未归因:3%
据我了解,这是因为查询是内存密集型的。鉴于我的表包含数百万行,有什么方法可以使用集群我的数据?
解决方案
BigQuery 中的大多数分析函数目前在单个分片(机器)上运行一个分区,因此分区大小在内存中被限制为大约 1GB 数据大小。在您的查询中,OVER ()
意味着没有分区 - 所有数据都在单个分区中运行。
解决方案通常是在一些大粒度上对数据进行分区。例如,如果数据具有一些空间层次结构,您可以按此列进行分区 - 例如 do OVER(PARTITION BY state)
。当然,这意味着不会有跨状态的集群,所以结果并不完全相同,但如果有自然集群,这通常是合理的。
如果这种内在层次结构不可用,另一种选择是通过一个简短的 geohash 进行分区(字母很少 - 尽可能多地避免资源超出错误),例如OVER(PARTITION BY st_geohash(point, 2))
. 一个不错的选择是S2_CellIDFromPoint(ST_Centroid(geo, level))
,请参阅S2 单元大小以选择单元级别。
推荐阅读
- reactjs - Firebase Firestore 数据未显示在我的 React 地图功能中
- php - html中表单下的PHP响应
- powershell - 如何使用powershell从html输出中提取数据
- r - 创建一个变量,包括日期时间变量的滞后和超前
- java - 在 Spring Boot 应用程序中实现 Reactive Kafka Listener
- java - Hibernate 调用强制转换异常
- css - React:生产构建看起来与开发构建不同
- node.js - Google Cloud Function - 读取使用 NodeJS 创建的存储桶的新文件的内容
- azure-data-explorer - 无法使用 ADX 外部表“虚拟列”访问 ADLS Gen 2 中的文件
- python - 有没有办法使用 python 发送和接收调制信号的信号?