Geohashes 形成一个网格,很像矩阵。
如果我有一个包含 geohash7 和一个值的表,我如何计算 BigQuery 上所有相邻单元格的平均值?
示例源表
geohash7 | 价值 |
---|---|
r1q6fh3 | 7 |
r1q6fh6 | 2 |
r1q6fh7 | 5 |
r1q6fh1 | 7 |
r1q6fh4 | 2 |
r1q6fh5 | 6 |
r1q6f5c | 4 |
r1q6f5f | 2 |
r1q6f5g | 7 |
样本输出表
geohash7 | 价值 |
---|---|
r1q6fh4 | 4.6 |
... | ... |
理想情况下以可扩展的方式进行,因为我想在大片陆地上运行它。
首先,您需要一个返回邻居的函数。获取一个 javascript geohash 库并将其用作 UDF 可能更容易,而不是在 SQL 中进行一些摆弄。
一旦你有一个返回邻居的函数,比如说
GeoHashNeibors(center STRING) RETURNS ARRAY<STRING>
然后您可以将原始表与扁平化的邻居列表连接起来并计算平均值。有点像
WITH with_neighbors AS (
select geohash, value, neighbor
from data d, unnest(GeoHashNeibors(d.geohash)) neighbor
),
joined AS (
select t1.geohash, t1.value, t1.neighbor, t2.value as n_value
from with_neighbors t1 left join data t2
on t1.neighbor = t2.geohash
)
SELECT geohash, ANY_VALUE(value) value, AVG(n_value) AS avg_neighbor
FROM joined
GROUP BY 1