Sorry yeah good question. It happens on the call to spark.table("pixels")

On Mon, Nov 1, 2021 at 12:36 PM Wenchen Fan <cloud0...@gmail.com> wrote:

> To confirm: Does the error happen during view creation, or when we read
> the view later?
>
> On Mon, Nov 1, 2021 at 11:28 PM Adam Binford <adam...@gmail.com> wrote:
>
>> I don't have a minimal reproduction right now but here's more relevant
>> code snippets.
>>
>> Stacktrace:
>>  org.apache.spark.sql.AnalysisException: Undefined function:
>> 'ST_PolygonFromEnvelope'. This function is neither a registered temporary
>> function nor a permanent function registered in the database 'default'.;
>> line 2 pos 50
>>   at
>> org.apache.spark.sql.catalyst.catalog.SessionCatalog.failFunctionLookup(SessionCatalog.scala:1562)
>>   at
>> org.apache.spark.sql.catalyst.catalog.SessionCatalog.lookupFunction(SessionCatalog.scala:1660)
>>   at
>> org.apache.spark.sql.catalyst.catalog.SessionCatalog.lookupFunction(SessionCatalog.scala:1677)
>>   at
>> org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$27$$anonfun$applyOrElse$114.$anonfun$applyOrElse$116(Analyzer.scala:2150)
>>   at
>> org.apache.spark.sql.catalyst.analysis.package$.withPosition(package.scala:60)
>>   at
>> org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$27$$anonfun$applyOrElse$114.applyOrElse(Analyzer.scala:2150)
>>   at
>> org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$27$$anonfun$applyOrElse$114.applyOrElse(Analyzer.scala:2137)
>>   at
>> org.apache.spark.sql.catalyst.trees.TreeNode.$anonfun$transformDownWithPruning$1(TreeNode.scala:481)
>>   at
>> org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:82)
>>   at
>> org.apache.spark.sql.catalyst.trees.TreeNode.transformDownWithPruning(TreeNode.scala:481)
>>
>> Expression definition:
>> case class ST_PolygonFromEnvelope(inputExpressions: Seq[Expression])
>> extends Expression with CodegenFallback with UserDataGeneratator {
>>   override def nullable: Boolean = false
>>
>>   override def eval(input: InternalRow): Any = {
>>     val minX = inputExpressions(0).eval(input) match {
>>       case a: Double => a
>>       case b: Decimal => b.toDouble
>>     }
>>
>>     val minY = inputExpressions(1).eval(input) match {
>>       case a: Double => a
>>       case b: Decimal => b.toDouble
>>     }
>>
>>     val maxX = inputExpressions(2).eval(input) match {
>>       case a: Double => a
>>       case b: Decimal => b.toDouble
>>     }
>>
>>     val maxY = inputExpressions(3).eval(input) match {
>>       case a: Double => a
>>       case b: Decimal => b.toDouble
>>     }
>>
>>     var coordinates = new Array[Coordinate](5)
>>     coordinates(0) = new Coordinate(minX, minY)
>>     coordinates(1) = new Coordinate(minX, maxY)
>>     coordinates(2) = new Coordinate(maxX, maxY)
>>     coordinates(3) = new Coordinate(maxX, minY)
>>     coordinates(4) = coordinates(0)
>>     val geometryFactory = new GeometryFactory()
>>     val polygon = geometryFactory.createPolygon(coordinates)
>>     new GenericArrayData(GeometrySerializer.serialize(polygon))
>>   }
>>
>>   override def dataType: DataType = GeometryUDT
>>
>>   override def children: Seq[Expression] = inputExpressions
>> }
>>
>> Function registration:
>> Catalog.expressions.foreach(f => {
>>       val functionIdentifier =
>> FunctionIdentifier(f.getClass.getSimpleName.dropRight(1))
>>       val expressionInfo = new ExpressionInfo(
>>         f.getClass.getCanonicalName,
>>         functionIdentifier.database.orNull,
>>         functionIdentifier.funcName)
>>       sparkSession.sessionState.functionRegistry.registerFunction(
>>         functionIdentifier,
>>         expressionInfo,
>>         f
>>       )
>>     })
>>
>> On Mon, Nov 1, 2021 at 10:43 AM Wenchen Fan <cloud0...@gmail.com> wrote:
>>
>>> Hi Adam,
>>>
>>> Thanks for reporting this issue! Do you have the full stacktrace or a
>>> code snippet to reproduce the issue at Spark side? It looks like a bug, but
>>> it's not obvious to me how this bug can happen.
>>>
>>> Thanks,
>>> Wenchen
>>>
>>> On Sat, Oct 30, 2021 at 1:08 AM Adam Binford <adam...@gmail.com> wrote:
>>>
>>>> Hi devs,
>>>>
>>>> I'm working on getting Apache Sedona upgraded to work with Spark 3.2,
>>>> and ran into a weird issue I wanted to get some feedback on. The PR and
>>>> current discussion can be found here:
>>>> https://github.com/apache/incubator-sedona/pull/557
>>>>
>>>> To try to sum up in a quick way, this library defines custom
>>>> expressions and registers the expressions using
>>>> sparkSession.sessionState.functionRegistry.registerFunction. One of
>>>> the unit tests is now failing because the function can't be found when a
>>>> temporary view using that function is created in pure SQL.
>>>>
>>>> Examples:
>>>> This fails with Undefined function: 'ST_PolygonFromEnvelope'. This
>>>> function is neither a registered temporary function nor a permanent
>>>> function registered in the database 'default'.:
>>>>
>>>>  spark.sql(
>>>>         """
>>>>           |CREATE OR REPLACE TEMP VIEW pixels AS
>>>>           |SELECT pixel, shape FROM pointtable
>>>>           |LATERAL VIEW EXPLODE(ST_Pixelize(shape, 1000, 1000, 
>>>> ST_PolygonFromEnvelope(-126.790180,24.863836,-64.630926,50.000))) AS pixel
>>>>         """.stripMargin)
>>>>
>>>>       // Test visualization partitioner
>>>>       val zoomLevel = 2
>>>>       val newDf = VizPartitioner(spark.table("pixels"), zoomLevel, 
>>>> "pixel", new Envelope(0, 1000, 0, 1000))
>>>>
>>>>
>>>> But both of these work fine:
>>>>
>>>>  val table = spark.sql(
>>>>        """
>>>>          |SELECT pixel, shape FROM pointtable
>>>>          |LATERAL VIEW EXPLODE(ST_Pixelize(shape, 1000, 1000, 
>>>> ST_PolygonFromEnvelope(-126.790180,24.863836,-64.630926,50.000))) AS pixel
>>>>         """.stripMargin)
>>>>
>>>>       // Test visualization partitioner
>>>>       val zoomLevel = 2
>>>>       val newDf = VizPartitioner(table, zoomLevel, "pixel", new 
>>>> Envelope(0, 1000, 0, 1000))
>>>>
>>>>     val table = spark.sql(
>>>>        """
>>>>          |SELECT pixel, shape FROM pointtable
>>>>          |LATERAL VIEW EXPLODE(ST_Pixelize(shape, 1000, 1000, 
>>>> ST_PolygonFromEnvelope(-126.790180,24.863836,-64.630926,50.000))) AS pixel
>>>>         """.stripMargin)
>>>>       table.createOrReplaceTempView("pixels")
>>>>
>>>>       // Test visualization partitioner
>>>>       val zoomLevel = 2
>>>>       val newDf = VizPartitioner(spark.table("pixels"), zoomLevel, 
>>>> "pixel", new Envelope(0, 1000, 0, 1000))
>>>>
>>>>
>>>> So the main question is, is this a feature or a bug?
>>>>
>>>> --
>>>> Adam Binford
>>>>
>>>
>>
>> --
>> Adam Binford
>>
>

-- 
Adam Binford

Reply via email to