list - 如何处理不同类型的 PySpark UDF 返回值?
问题描述
我有一个包含一列的数据框。在这个数据框的每一行中,都有一个列表。例如 :
df = spark.createDataFrame(
[
[[13,23]],
[[55,65]],
],
['col',]
)
然后我定义了一个 UDF,它基本上将列表中的第一个数字加 1,并将列表的第二个数字加 1.5。
def calculate(mylist) :
x = mylist[0] + 1
y = mylist[1] + 1.5
return x,y
问题是当我将此函数应用于我的数据框时,它返回 X 值但不返回 Y 值。我认为这是因为 Y 值不是整数。这就是我这样做的方式。
import pyspark.sql.functions as F
from pyspark.sql.types import IntegerType, ArrayType
func = F.udf(lambda x: calculate(x), ArrayType(IntegerType()))
df.withColumn('vals', func('col')).show()
我能做些什么来获得 Y 值和 X 值?为了易于理解和解决,我简化了 UDF 和示例数据框。
解决方案
计算udf
正在返回integer
并float
使用给定的输入进行输入。如果您的用例第一个值为整数,第二个值为float
,则可以返回StructType
如果两者都需要是相同的类型,您可以使用相同的代码并更改udf
返回两个整数的计算
func = F.udf(lambda x: calculate(x), T.StructType(
[T.StructField("val1", T.IntegerType(), True),
T.StructField("val2", T.FloatType(), True)]))
推荐阅读
- r - 将当前行与 R 中的前一行进行比较
- php - 使用 WPBakery Page Builder 5.4 更改徽标
- ios - 使用用户的 App Store 帐户进行多应用订阅
- javascript - 选中所有或一个复选框以启用提交按钮 angularjs
- autosys - Autosys 作业设置与日和前任条件
- php - 如何在函数中的 if 构造之外访问我的变量?
- javascript - 在执行 javascript 之前设置 5 秒延迟
- r - 合并预制的 plot_ly 对象
- spring - Spring Application Events 的典型用例是什么?
- javascript - Javascript替换字符串函数