如何在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直接调用的东西?
Catalog.expressions.foreach(f=>sparkSession.sessionState.functionRegistry.createOrReplaceTempFunction(f.getClass.getSimpleName.dropRight(1),f))
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
答案 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")))