0

如何在 spark SQL scala DSL API 中访问催化剂表达式(不是常规 UDF)?

http://geospark.datasyslab.org只允许基于文本的执行

GeoSparkSQLRegistrator.registerAll(sparkSession)
var stringDf = sparkSession.sql(
  """
    |SELECT ST_SaveAsWKT(countyshape)
    |FROM polygondf
  """.stripMargin)

当我尝试使用 SQL scala DSL df.withColumn("foo", ST_Point(col("x"), col("y")))时,出现类型不匹配预期列得到ST_Point的错误。

我需要更改哪些catalyst expression内容才能正确注册为可直接通过 scala SQL DSL API 调用的内容?

编辑

催化剂表达式都通过https://github.com/DataSystemsLab/GeoSpark/blob/fadccf2579e4bbe905b2c28d5d1162fdd72aa99c/sql/src/main/scala/org/datasyslab/geosparksql/UDF/UdfRegistrator.scala#L38注册:

Catalog.expressions.foreach(f=>sparkSession.sessionState.functionRegistry.createOrReplaceTempFunction(f.getClass.getSimpleName.dropRight(1),f))

编辑2

import org.apache.spark.sql.geosparksql.expressions.ST_Point
val  myPoint = udf((x: Double, y:Double) => ST_Point _)

失败:

_ must follow method; cannot follow org.apache.spark.sql.geosparksql.expressions.ST_Point.type
4

2 回答 2

1

您可以使用该方法访问未在 org.apache.spark.sql.functions 包中公开的表达式expr。它实际上并没有在 Scala 中为您提供类似 UDF 的对象,但它确实允许您使用 Dataset API 编写查询的其余部分。

这是文档中的一个示例:

// get the number of words of each length
df.groupBy(expr("length(word)")).count()
于 2018-07-10T16:55:42.123 回答
0

这是您可以用来调用 UDF 的另一种方法以及我到目前为止所做的工作。

      .withColumn("locationPoint", callUDF("ST_Point", col("longitude"),
        col("latitude")))
于 2018-07-14T00:54:44.097 回答