You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sedona.apache.org by ji...@apache.org on 2026/02/11 09:47:25 UTC
(sedona) 01/01: fix: skip re-registration of functions in SedonaContext.create()
This is an automated email from the ASF dual-hosted git repository.
jiayu pushed a commit to branch fix/2640-simplify-sedonacontext-warnings
in repository https://gitbox.apache.org/repos/asf/sedona.git
commit 8553b05db256e5a1901664a14892137170689a12
Author: Jia Yu <ji...@apache.org>
AuthorDate: Wed Feb 11 01:46:03 2026 -0800
fix: skip re-registration of functions in SedonaContext.create()
When SedonaContext.create() is called a second time, all ~329 ST functions
are re-registered. Spark's FunctionRegistry detects that each function
already exists with a different builder closure and emits a WARN log for
each one, producing hundreds of noisy warning lines.
Guard both expression and aggregate function registration with
functionExists() checks to skip functions that are already registered
in the session's function registry.
Closes #2640
---
.../apache/sedona/sql/UDF/AbstractCatalog.scala | 36 +++++++++++++---------
1 file changed, 21 insertions(+), 15 deletions(-)
diff --git a/spark/common/src/main/scala/org/apache/sedona/sql/UDF/AbstractCatalog.scala b/spark/common/src/main/scala/org/apache/sedona/sql/UDF/AbstractCatalog.scala
index fc15570d16..2f7784fd7a 100644
--- a/spark/common/src/main/scala/org/apache/sedona/sql/UDF/AbstractCatalog.scala
+++ b/spark/common/src/main/scala/org/apache/sedona/sql/UDF/AbstractCatalog.scala
@@ -83,15 +83,18 @@ abstract class AbstractCatalog {
}
def registerAll(sparkSession: SparkSession): Unit = {
+ val registry = sparkSession.sessionState.functionRegistry
expressions.foreach { case (functionIdentifier, expressionInfo, functionBuilder) =>
- sparkSession.sessionState.functionRegistry.registerFunction(
- functionIdentifier,
- expressionInfo,
- functionBuilder)
- FunctionRegistry.builtin.registerFunction(
- functionIdentifier,
- expressionInfo,
- functionBuilder)
+ if (!registry.functionExists(functionIdentifier)) {
+ registry.registerFunction(
+ functionIdentifier,
+ expressionInfo,
+ functionBuilder)
+ FunctionRegistry.builtin.registerFunction(
+ functionIdentifier,
+ expressionInfo,
+ functionBuilder)
+ }
}
aggregateExpressions.foreach { f =>
registerAggregateFunction(sparkSession, f.getClass.getSimpleName, f)
@@ -106,13 +109,16 @@ abstract class AbstractCatalog {
sparkSession: SparkSession,
functionName: String,
aggregator: Aggregator[Geometry, _, _]): Unit = {
- sparkSession.udf.register(functionName, functions.udaf(aggregator))
- FunctionRegistry.builtin.registerFunction(
- FunctionIdentifier(functionName),
- new ExpressionInfo(aggregator.getClass.getCanonicalName, null, functionName),
- (_: Seq[Expression]) =>
- throw new UnsupportedOperationException(
- s"Aggregate function $functionName cannot be used as a regular function"))
+ val functionIdentifier = FunctionIdentifier(functionName)
+ if (!sparkSession.sessionState.functionRegistry.functionExists(functionIdentifier)) {
+ sparkSession.udf.register(functionName, functions.udaf(aggregator))
+ FunctionRegistry.builtin.registerFunction(
+ functionIdentifier,
+ new ExpressionInfo(aggregator.getClass.getCanonicalName, null, functionName),
+ (_: Seq[Expression]) =>
+ throw new UnsupportedOperationException(
+ s"Aggregate function $functionName cannot be used as a regular function"))
+ }
}
def dropAll(sparkSession: SparkSession): Unit = {