1

如何在火花斯卡拉數據框(非文本)API中訪問幾何體UDF?即如何轉換在斯卡拉火花數據框中提供spark-sql UDF可用數據幀DSL API

如何使scala數據框DSL中可用的文本spark-sql API中提供sql UDF? 也就是說如何啓用此表達的,而不是類似於

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

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

東西如何的方式,這不僅適用於SQL文本模式寄存器geomesas UDF。 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

應該可用。

回答

1

您可以使用您要導入的org.apache.spark.sql.functions中的udf函數,例如,

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

您可以在df.select在DSL然後使用myUdf爲(myUdf($ 「場」))

+0

但SQLTypes.init(spark.sqlContext)已經註冊了函數。那麼使用你的解決方案會是一個問題嗎? –

+0

是的,但你失去了refrece即。如果該行是val ST_DistanceSpheroid:(Geometry,Geometry)=> jl.Double = nullableUDF((s,e)=> fastDistance(s.getCoordinate,e.getCoordinate))。您需要在DSL中使用ST_DistanceSpheroid –

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