SQL DSL的火花寄存器表达式

时间:2018-07-05 20:54:41

标签: scala apache-spark apache-spark-sql catalyst-optimizer

如何在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))

edit2

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

2 个答案:

答案 0 :(得分:1)

您可以使用advertorials(?:/(?!version).*)?$ 方法访问org.apache.spark.sql.functions包中未公开的表达式。它实际上并没有在Scala中为您提供类似UDF的对象,但确实允许您使用Dataset API编写其余查询。

下面是the docs的示例:

expr

答案 1 :(得分:0)

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

      .withColumn("locationPoint", callUDF("ST_Point", col("longitude"),
        col("latitude")))