Apache Sedona 1.9.0 已正式发布,新增 Spark 4.1 支持、proj4sedona 坐标系转换、Bing Tile 函数等众多特性!

DataFrame 风格函数

Sedona SQL 函数可以通过类似于 Spark 函数的 DataFrame 风格 API 使用。

下列对象包含了对外暴露的函数:org.apache.spark.sql.sedona_sql.expressions.st_functionsorg.apache.spark.sql.sedona_sql.expressions.st_constructorsorg.apache.spark.sql.sedona_sql.expressions.st_predicates 以及 org.apache.spark.sql.sedona_sql.expressions.st_aggregates

每个函数都可以接收全为 Column 类型的参数。此外,重载形式通常还可以接收 String 和其他 Scala 类型(例如 Double)的混合参数。

一般而言适用以下规则(不过具体函数请参考各自的文档以了解可能的例外):

  1. 每个函数都返回一个 Column,因此可以与 Spark 函数以及 DataFrame 的方法(如 DataFrame.selectDataFrame.join)互换使用。
  2. 每个函数都有一种全部以 Column 作为参数的形式。 这种形式是最通用的。
  3. 大多数函数都有一种以 String 参数与其他 Scala 类型混合使用的形式。
  1. Column 类型的参数会被原样透传,并始终被接受。
  2. str 类型的参数总是被视为列名,并会自动包装到 Column 中。 如果需要传递一个实际的字符串字面量,则需要使用 pyspark.sql.functions.lit 把它包装成 Column
  3. 其他类型的参数会按函数逐一检查。一般来说,能够合理对应 python 原生类型的参数会被接受并透传。 4. 目前所有函数都不接受 Shapely 的 Geometry 对象。

允许的参数类型组合视具体函数而定。 不过在这些情况下,所有 String 参数都会被视为列名,并自动包装成 Column。 非 String 参数会被视为字面量并直接传给对应的 sedona 函数。如果你需要传递 String 类型的字面量,应使用 sedona 函数的全 Column 形式,并通过 Spark 的 lit 函数将该 String 字面量包装成 Column

下面是使用该 API 的一个简短示例(用到了 Spark 的 array_minarray_max 函数):

val values_df = spark.sql("SELECT array(0.0, 1.0, 2.0) AS values")
val min_value = array_min("values")
val max_value = array_max("values")
val point_df = values_df.select(ST_Point(min_value, max_value).as("point"))
from pyspark.sql import functions as f

from sedona.spark import *

df = spark.sql("SELECT array(0.0, 1.0, 2.0) AS values")

min_value = f.array_min("values")
max_value = f.array_max("values")

df = df.select(ST_Point(min_value, max_value).alias("point"))

上面的代码将生成如下 dataframe:

+-----------+
|point      |
+-----------+
|POINT (0 2)|
+-----------+

某些函数会接受 python 的原生值并将其推断为字面量。 例如:

from sedona.spark import *

df = df.select(ST_Point(1.0, 3.0).alias("point"))

这会生成一个包含常量点的列:

+-----------+
|point      |
+-----------+
|POINT (1 3)|
+-----------+