如何使用Databricks Mosaic库获取H3十六进制ID?
问题
测试Databricks Mosaic空间网格索引方法时,尝试通过grid_longlatascellid获取给定经纬度的H3十六进制ID,运行代码后仅返回Column对象,无法看到实际的十六进制值;而直接使用h3.geo_to_h3方法能得到实际的十六进制字符串。
已知配置与导入代码:
import h3 from mosaic import enable_mosaic enable_mosaic(spark, dbutils) from mosaic import * spark.conf.set("spark.databricks.labs.mosaic.index.system", "H3")
测试代码及结果:
# 获取经纬度 latitude = 37.7716736 longitude = -122.4485852 # 获取分辨率 resolution = 7 # 获取H3十六进制ID h3_hex_id = grid_longlatascellid(lit(latitude), lit(longitude), lit(resolution)).hex # 打印H3十六进制ID print(h3_hex_id) # 输出:Column<'grid_longlatascellid(CAST(37.7716736 AS DOUBLE), CAST(-122.4485852 AS DOUBLE), 7)[hex]'>
格式差异示例:
h3.geo_to_h3返回:'872830829ffffff'- Mosaic的
grid_longlatascellid默认返回十进制整数:623385352048508927
解决方案
方法1:使用Mosaic内置函数转换并查看结果
Mosaic提供grid_cellidash3函数,可直接将grid_longlatascellid返回的十进制ID转换为标准H3十六进制字符串。需在Spark DataFrame上下文执行计算,而非直接打印Column对象:
latitude = 37.7716736 longitude = -122.4485852 resolution = 7 # 创建临时DataFrame执行计算 result_df = spark.createDataFrame([(longitude, latitude)], ["lon", "lat"]) result_df = result_df.select( grid_cellidash3(grid_longlatascellid("lon", "lat", lit(resolution))).alias("h3_hex") ) # 查看结果 result_df.show(truncate=False)
执行后输出示例:
+-------------+ |h3_hex | +-------------+ |872830829ffffff| +-------------+
方法2:提取结果到Python本地变量
如果需要将十六进制ID提取为Python本地变量,可通过DataFrame计算后获取值:
latitude = 37.7716736 longitude = -122.4485852 resolution = 7 # 计算并提取值 h3_hex_value = ( spark.createDataFrame([(longitude, latitude)], ["lon", "lat"]) .select( grid_cellidash3(grid_longlatascellid("lon", "lat", lit(resolution))).alias("h3_hex") ) .first()["h3_hex"] ) print(h3_hex_value) # 输出:872830829ffffff
关键说明
grid_longlatascellid返回的是Spark Column对象,代表H3网格ID的十进制整数表示,不能直接在Python本地调用.hex获取结果,必须在Spark分布式计算环境中执行计算。grid_cellidash3函数专门用于将H3十进制ID转换为标准十六进制字符串,输出格式与h3.geo_to_h3完全一致。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

