1

如何在 spark scala 数据框(非文本)api 中访问 geomesas UDF?即如何转换

如何使 sql UDF 在 scala 数据框 DSL 中可用的文本 spark-sql API 中可用?即如何启用而不是这个表达式

spark.sql("select st_asText(st_bufferPoint(geom,10)) from chicago where case_number = 1")

类似于

df.select(st_asText(st_bufferPoint('geom, 10))).filter('case_number === 1)

如何注册 geomesas UDF,使其不仅适用于 sql 文本模式。SQLTypes.init(spark.sqlContext)来自https://github.com/locationtech/geomesa/blob/f13d251f4d8ad68f4339b871a3283e43c39ad428/geomesa-spark/geomesa-spark-sql/src/main/scala/org/apache/spark/sql/SQLTypes.scala#L59-L66似乎只有注册文本表达式。

我已经在导入

import org.apache.spark.sql.functions._

所以这些功能

https://github.com/locationtech/geomesa/blob/828822dabccb6062118e36c58df8c3a7fa79b75b/geomesa-spark/geomesa-spark-sql/src/main/scala/org/apache/spark/sql/SQLSpatialFunctions.scala#L31-L41

应该可用。

4

2 回答 2

1

您可以在要导入 的文件中使用该udf功能,例如org.apache.spark.sql.functions

val  myUdf = udf((x: String) => doSomethingWithX(x))

然后,您可以在 DSL 中使用 myUdf,如 df.select(myUdf($"field"))

于 2017-04-20T07:38:24.557 回答
1

看看callUDF函数来自org.apache.spark.sql.functions

val spark = SparkSession.builder()
  .appName("callUDF")
  .master("local[*]")
  .getOrCreate()
import spark.implicits._

val df = spark.createDataset(List("abcde", "bcdef", "cdefg")).toDF("str")
df.createTempView("view")

spark.sql("select length(substring(str, 2, 3)) from view").show()
df.select(callUDF("length", callUDF("substring", $"str", lit(2), lit(3)))).show()

spark.stop()

使用 Spark 2.1 测试

于 2017-04-20T07:51:54.763 回答