簡體   English   中英

使Spark-sql UDF在Scala Spark數據幀DSL API中可用

[英]Make spark-sql UDF available in Scala spark data frame DSL API

如何在Spark Scala DataFrame(非文本)API中訪問Geomesas UDF? 即如何轉換

如何在scala數據幀DSL中的文本spark-sql API中使sql UDF可用? 即如何啟用而不是此表達式

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)

如何以不僅僅適用於sql文本模式的方式注冊geomesas UDF。 來自https://github.com/locationtech/geomesa/blob/f13d251f4d8ad68f4339b871a3283e43c39ad428/geomesa-spark/geomesa-spark-sql/src/main/scala/org/apache/spark/sql/sql/SQLTypes的 SQLTypes.init(spark.sqlContext) .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

應該可用。

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

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

然后可以像在df.select(myUdf($“ field”))中那樣在DSL中使用myUdf

看一下org.apache.spark.sql.functions中的callUDF函數

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測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM