You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Spark DataFrame调用H3几何生成函数的异常问题?

问题描述

我有一个包含H3六边形ID的Spark DataFrame,想要获取对应的多边形几何信息,但调用函数时出现异常:

  1. 第一次尝试代码:
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, expr
from pyspark.databricks.sql.functions import *

from mosaic import enable_mosaic
enable_mosaic(spark, dbutils)

# 创建Spark会话
spark = SparkSession.builder.appName("Mosaic").getOrCreate()

# 创建含H3 ID的DataFrame
df = spark.createDataFrame([
    (1, "87422c2a9ffffff"),
    (2, "87422c2a9000000"),
    (3, "87422c2a8ffffff")
], ("id", "h3hex_id"))

sdf2 = df.withColumn("geometry", h3_boundaryaswkt(col("h3hex_id")))
sdf2.sample(fraction=0.1).show()

报错:

AnalysisException: [H3_NOT_ENABLED] h3_boundaryaswkt is disabled or unsupported. Consider enabling Photon or switch to a tier that supports H3 expressions;

  1. 改用Mosaic的grid_boundary函数:
sdf2 = df.withColumn("geometry", grid_boundary(col("h3hex_id"), format_name="WKT"))
sdf2.sample(fraction=0.1).show()

报错:

AnalysisException: [UNRESOLVED_COLUMN.WITH_SUGGESTION] A column or function parameter with name WKT cannot be resolved. Did you mean one of the following? ..

已在集群安装databricks-mosaic 0.3.10,请问如何解决?


解决方案

1. 修复Spark会话初始化顺序

代码中先调用enable_mosaic(spark, dbutils)但未创建spark会话,导致Mosaic未正确注册函数。必须先创建Spark会话,再启用Mosaic。

2. 正确使用Mosaic的H3边界函数

Mosaic提供两种可靠方式获取H3多边形WKT:

方式一:h3_boundary + st_aswkt组合

h3_boundary返回二进制几何对象,需用st_aswkt转换为WKT格式:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col
from mosaic import enable_mosaic
from mosaic.functions import h3_boundary, st_aswkt

# 先创建Spark会话
spark = SparkSession.builder.appName("Mosaic").getOrCreate()
# 再启用Mosaic
enable_mosaic(spark, dbutils)

# 创建DataFrame
df = spark.createDataFrame([
    (1, "87422c2a9ffffff"),
    (2, "87422c2a9000000"),
    (3, "87422c2a8ffffff")
], ("id", "h3hex_id"))

# 生成WKT格式的多边形
sdf2 = df.withColumn("geometry", st_aswkt(h3_boundary(col("h3hex_id"))))
sdf2.show(truncate=False)

方式二:正确使用grid_boundary参数

grid_boundary的格式参数需用字符串字面量(用单引号包裹),同时要指定网格类型为H3:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col
from mosaic import enable_mosaic
from mosaic.functions import grid_boundary

spark = SparkSession.builder.appName("Mosaic").getOrCreate()
enable_mosaic(spark, dbutils)

df = spark.createDataFrame([
    (1, "87422c2a9ffffff"),
    (2, "87422c2a9000000"),
    (3, "87422c2a8ffffff")
], ("id", "h3hex_id"))

# 指定gridType为H3,format_name用单引号包裹
sdf2 = df.withColumn("geometry", grid_boundary(col("h3hex_id"), gridType="H3", format_name="'WKT'"))
sdf2.show(truncate=False)

3. 避免混用Databricks原生H3函数

报错中的h3_boundaryaswkt是Databricks原生H3函数,需集群启用Photon或对应付费Tier支持。既然已安装Mosaic,直接使用其提供的函数即可,无需依赖原生H3功能。


内容的提问来源于stack exchange,提问作者kms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:30:43