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 2023/03/22 16:48:43 UTC

[sedona] branch master updated: [SEDONA-266] RS_Values throws UnsupportedOperationException for shuffled point arrays (#805)

This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sedona.git


The following commit(s) were added to refs/heads/master by this push:
     new 099fd97d [SEDONA-266] RS_Values throws UnsupportedOperationException for shuffled point arrays (#805)
099fd97d is described below

commit 099fd97d0bdd487f3edc1c0c0e12762f1818d008
Author: Martin Andersson <u....@gmail.com>
AuthorDate: Wed Mar 22 17:48:36 2023 +0100

    [SEDONA-266] RS_Values throws UnsupportedOperationException for shuffled point arrays (#805)
---
 .../sql/sedona_sql/expressions/raster/Functions.scala  |  5 ++---
 .../org/apache/sedona/sql/rasteralgebraTest.scala      | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/Functions.scala b/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/Functions.scala
index 1e924304..af2edcdf 100644
--- a/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/Functions.scala
+++ b/sql/src/main/scala/org/apache/spark/sql/sedona_sql/expressions/raster/Functions.scala
@@ -894,9 +894,8 @@ case class RS_Values(inputExpressions: Seq[Expression]) extends Expression with
     if (raster == null || serializedGeometries == null) {
       null
     } else {
-      val geometries = serializedGeometries.array.map {
-        case b: Array[Byte] => GeometrySerializer.deserialize(b)
-        case _ => null
+      val geometries = (0 until serializedGeometries.numElements()).map {
+        i => Option(serializedGeometries.getBinary(i)).map(GeometrySerializer.deserialize).orNull
       }
       new GenericArrayData(Functions.values(raster, java.util.Arrays.asList(geometries:_*), band).toArray)
     }
diff --git a/sql/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala b/sql/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
index 024e1f6c..1bde6913 100644
--- a/sql/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
+++ b/sql/src/test/scala/org/apache/sedona/sql/rasteralgebraTest.scala
@@ -18,6 +18,7 @@
  */
 package org.apache.sedona.sql
 
+import org.apache.spark.sql.functions.{collect_list, expr}
 import org.geotools.coverage.grid.GridCoverage2D
 import org.locationtech.jts.geom.Geometry
 import org.scalatest.{BeforeAndAfter, GivenWhenThen}
@@ -312,5 +313,22 @@ class rasteralgebraTest extends TestBaseScala with BeforeAndAfter with GivenWhen
       assert(result.get(0) == 255d)
       assert(result.get(1) == null)
     }
+
+    it("Passed RS_Values with raster and serialized point array") {
+      // https://issues.apache.org/jira/browse/SEDONA-266
+      // A shuffle changes the internal type for the geometry array (point in this case) from GenericArrayData to UnsafeArrayData.
+      // UnsafeArrayData.array() throws UnsupportedOperationException.
+      val df = sparkSession.read.format("binaryFile").load(resourceFolder + "raster/test1.tiff")
+      val points = sparkSession.createDataFrame(Seq(("POINT (-13077301.685 4002565.802)",1), ("POINT (0 0)",2)))
+        .toDF("point", "id")
+        .withColumn("point", expr("ST_GeomFromText(point)"))
+        .groupBy().agg(collect_list("point").alias("point"))
+
+      val result = df.crossJoin(points).selectExpr("RS_Values(RS_FromGeoTiff(content), point)").first().getList[Any](0)
+
+      assert(result.size() == 2)
+      assert(result.get(0) == 255d)
+      assert(result.get(1) == null)
+    }
   }
 }