可以在纯 Spark SQL 中使用 Spark Pandas UDF 吗?

Nei*_*gan 6 apache-spark-sql pyspark

这有效:

from pyspark.sql import SparkSession
from pyspark.sql.functions import pandas_udf
import pandas as pd

spark = SparkSession.builder.getOrCreate()

@pandas_udf(returnType="long")
def add_one(v: pd.Series) -> pd.Series:
    return v.add(1)

spark.udf.register("add_one", add_one)

spark.sql("select add_one(1)").show()
Run Code Online (Sandbox Code Playgroud)

但是,我想知道是否/如何进行以下工作:

$ spark-sql -e 'select add_one(1)'
Run Code Online (Sandbox Code Playgroud)

tuk*_*kan 4

如果有人能使用它那就太好了。

恐怕目前这是不可能的。有趣的是,实际上没有人提到它。

这些信息实际上“隐藏”在 apache Spark 文档的一个小注释中:

请注意,Spark SQL CLI 无法与 Thrift JDBC 服务器通信。

正如您可能了解的含义,这意味着您无法UDFs从 CLI调用spark-sql。这是文档的链接。

可以仔细检查bin/spark-sql github 上的源代码,实际做了什么:

if [ -z "${SPARK_HOME}" ]; then
  source "$(dirname "$0")"/find-spark-home
fi

export _SPARK_CMD_USAGE="Usage: ./bin/spark-sql [options] [cli option]"
exec "${SPARK_HOME}"/bin/spark-submit --class org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver "$@"
Run Code Online (Sandbox Code Playgroud)

当它提交给 时thriftserver,这再次确认您不能使用UDFat spark-sqlCLI。