如何解决Spark DataFrame调用H3几何生成函数的异常问题?
我有一个包含H3六边形ID的Spark DataFrame,想要获取对应的多边形几何信息,但调用函数时出现异常:
- 第一次尝试代码:
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;
- 改用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
WKTcannot 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

