【问题标题】:How to handle PySpark UDF return values in different types?如何处理不同类型的 PySpark UDF 返回值?
【发布时间】:2020-05-09 06:15:27
【问题描述】:

我有一个包含一列的数据框。在这个数据框的每一行中,都有一个列表。例如:

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 和示例数据框。

【问题讨论】:

    标签: list dataframe pyspark typeerror user-defined-functions


    【解决方案1】:

    calculate udf 将返回 integerfloat 类型以及给定的输入。 如果您的用例第一个值为整数,第二个值为float,则可以返回StructType

    如果两者都需要是相同的类型,您可以使用相同的代码并更改计算udf,它返回两个整数

    func = F.udf(lambda x: calculate(x), T.StructType(
            [T.StructField("val1", T.IntegerType(), True),
             T.StructField("val2", T.FloatType(), True)]))
    

    【讨论】:

    • 非常感谢您的回答。现在你能帮我把 X 和 Y 分别放在 2 列吗?我正在使用此代码 df = df.select("col", df.vals[0], df.vals[1]) 但我收到此错误 org.apache.spark.sql.AnalysisException: Field name should be String字面意思,但它是 0;
    • 使用您的代码,我在 1 列的列表中获得 X 和 Y 值。但是我想在一列中写 X,在另一列中写 Y。
    • @OMIDDavami 使用架构解码,例如使用 df.vals['val1'] 代替 df.vals[0]
    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 2022-11-24
    • 1970-01-01
    • 2021-11-21
    • 2021-04-13
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多