首页 > 解决方案 > 定义可以在不是 UDF 的 spark sql 中调用的自定义方法

问题描述

我想定义一个方法,blob()它返回一个org.apache.spark.sql.Column,我可以在 Scala spark sql 中调用它,例如:

spark.sql("blob(...) //other stuff")

因此,我无法将此方法创建/注册为 UDF,因为它们只能返回 Spark 数据类型,如IntegerType,TimestampType

我考虑将其注册为本机 Spark 方法,但这涉及导入一些第三方 repo,这可能会在未来基于 Spark 版本导致问题,或者分叉我自己的 Spark 催化剂库版本——我不想做任何一个。

现在我正在研究使用如下扩展构建我的 Spark 会话:

SparkSession sparkSession = SparkSession.builder()
  .config(sparkConf)
  .withExtensions(//extensions)
  .getOrCreate();

看起来我可以添加可能让我实现目标的规则。看起来 Spark 3.0+ 有一个非常适合这个https://spark.apache.org/docs/3.0.0-preview/api/java/org/apache/spark/sql/SparkSessionExtensions.html#injectFunction-scala的方法.Tuple3- 但不幸的是,我被困在 Spark 2.4 上,它有一个 SparkSessionExtensions 版本,其中包含除该方法之外的所有内容。这是做这件事的正确方法吗?

标签: javascalaapache-sparkuser-defined-functions

解决方案


推荐阅读