Apache spark 是否可以注册DataFrame API函数以在SQL表达式中使用?

Apache spark 是否可以注册DataFrame API函数以在SQL表达式中使用?,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,PySpark允许通过UDF在SQL表达式中引用Python函数,例如: df = spark.createDataFrame([Row(col_a="hello", col_b=1)]) def py_len(c): return len(c) spark.udf.register("pyLen", py_len) df.selectExpr("pyLen(col_a)") 但是有没有办法注册一个返回列表达式的函数呢?正如

PySpark允许通过UDF在SQL表达式中引用Python函数,例如:

df = spark.createDataFrame([Row(col_a="hello", col_b=1)])

def py_len(c):
    return len(c)
spark.udf.register("pyLen", py_len)
df.selectExpr("pyLen(col_a)")
但是有没有办法注册一个返回列表达式的函数呢?正如所料,这不起作用:

import pyspark.sql.functions as sqlf

def add_one(col_name: str) -> Column:
   return sqlf.col(col_name) + sqlf.lit(1)
spark.udf.register("addOne", add_one)
df.selectExpr("addOne(col_b)")

有没有办法做到这一点或类似的事情?这很容易做到,而且在使用DataFrame API时是一种常见的模式,我认为在纯SQL中很简单,但它似乎不是这样。

这是否意味着
column\u name
是数据帧中的一列,您实际上需要一个动态UDF?是的--我将进行编辑以使其更清晰。看起来您必须在这里使用rdd api(这可能只是因为我不知道怎么做,但我无法想象spark在执行时会按行计算
col()
值)。您对其他方法感兴趣吗?我想应该是在JVM编译时,而不是在执行时——因为列对象总是有一个对应的SQL表达式字符串,一个类似于
addOne(col_b)的语句
将始终直接转换为类似于
col_b+1
的内容。在PL/SQL中类似于此:我的替代方法是完全放弃
expr
API,并使用一个使用DataFrame API的接口。