当前位置: 首页 > 知识库问答 >
问题:

如何使用UDF添加多列?

曾山
2023-03-14

问题

我希望将UDF的返回值添加到seperate列中的现有dataframe中。我如何以足智多谋的方式实现这一点?

from pyspark.sql.functions import udf
from pyspark.sql.types import ArrayType, StructType, StructField, IntegerType  

df = spark.createDataFrame([("Alive",4)],["Name","Number"])
df.show(1)

+-----+------+
| Name|Number|
+-----+------+
|Alive|     4|
+-----+------+

def example(n):
        return [[n+2], [n-2]]

#  schema = StructType([
#          StructField("Out1", ArrayType(IntegerType()), False),
#          StructField("Out2", ArrayType(IntegerType()), False)])

example_udf = udf(example)
newDF = df.withColumn("Output", example_udf(df["Number"]))
newDF.show(1)
+-----+------+----------+
| Name|Number|Output    |
+-----+------+----------+
|Alive|     4|[[6], [2]]|
+-----+------+----------+
+-----+------+----+----+
| Name|Number|Out1|Out2|
+-----+------+----+----+
|Alive|     4|   6|   2|
+-----+------+----+----+

Edit:我注释掉了StructType的使用(并编辑了udf赋值),因为示例函数的返回类型不需要使用StructType。但是,如果返回值类似于

return [6,3,2],[4,3,1]

共有1个答案

锺离声
2023-03-14

要返回StructType,只需使用

df = spark.createDataFrame([("Alive", 4)], ["Name", "Number"])


def example(n):
    return Row('Out1', 'Out2')(n + 2, n - 2)


schema = StructType([
    StructField("Out1", IntegerType(), False),
    StructField("Out2", IntegerType(), False)])

example_udf = f.UserDefinedFunction(example, schema)

newDF = df.withColumn("Output", example_udf(df["Number"]))
newDF = newDF.select("Name", "Number", "Output.*")

newDF.show(truncate=False)
 类似资料:
  • 我有一个 功能,请告诉我是否有任何解决方法。 谢谢你。!

  • 问题内容: 如何使用Javascript 添加CSS规则(例如)? 问题答案: 您也可以使用DOM Level 2 CSS接口(MDN)执行此操作: …(除了(自然地)IE8和更早版本以外的所有版本),它使用自己的边际差异措辞: 与createElement-set- innerHTML方法相比,此方法具有理论上的优势,因为您不必担心在innerHTML中放置特殊的HTML字符,但实际上,样式元素

  • 问题内容: 如何使用Dockerfile添加用户-以下内容不起作用。 我完整的Dockerfile: 问题答案: 使用而非交互来添加用户。 以下命令不会创建user。 它将使用用户 请参考Dockerfile用户文档 USER指令设置运行映像时使用的用户名或UID,以及Dockerfile中跟随该映像的所有RUN,CMD和ENTRYPOINT指令。 注意: 确保这是默认外壳程序。 如果使用默认外壳

  • 我有一个观察数据表和是和否的模型。为简单起见,我只假设对组。我浪费了一些分类统计数据,我想控制选择哪一个。我知道如何使用eval做到这一点并将其保存在另一个data.table中,但我想添加到现有的data.table中,因为我每个组只有一行。任何人都可以帮我吗? 首先,我为每个组创建列联表。 然后定义统计数据 如果我使用下面几行,它会给我一个新的数据表: 如何在此示例中使用:=将结果添加到我的旧

  • 我使用laravel框架,也使用ffmpeg PHP库。其实我做了差不多百分之七十的工作。但是我面临的问题是在视频的多个区域显示水印。我做了左上角的水印,在那个视频上运行得很好。但是我想在左上,左下,右下添加水印。我使用这个代码的左上角水印(视频):- 请帮助我如何在这些区域的左上角、左下角和右下角添加水印。提前感谢:)

  • 问题内容: 我试图在没有LTV格式的已签名PDF文档中启用LTV。在所有情况下,我都找到了相同的示例,如链接中所述。如何为时间戳签名启用LTV,启用iText LTV-如何添加更多CRL?,它定义了获得预期结果的过程。碰巧我没有工作,它没有给我任何错误,但是我没有添加LTV。 为什么在执行以下代码时不会给我任何错误,但是我不添加LTV的一些想法。 这是我尝试添加LTV的方法: 我正在使用的版本: