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)
+ }
}
}