如何使用UDF添加多列?

2024-01-04

Question

我想将 UDF 的返回值添加到单独列中的现有数据帧中。我如何以足智多谋的方式实现这一目标?

这是我到目前为止所拥有的一个例子。

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]]|
+-----+------+----------+

但是,我不希望这两个值位于同一列中,而是位于不同的列中。

理想情况下,我想现在分割输出列,以避免调用示例函数两次(每个返回值一次),如下所示here https://stackoverflow.com/questions/34362412/pyspark-split-a-column-to-multiple-columns-without-pandas and here https://stackoverflow.com/questions/39235704/split-spark-dataframe-string-column-into-multiple-columns,但是在我的情况下,我得到了一个数组数组,但我看不到拆分如何在那里工作(请注意,每个数组将包含多个值,用“,”分隔。

结果应该是什么样子

我最终想要的是这个

+-----+------+----+----+
| Name|Number|Out1|Out2|
+-----+------+----+----+
|Alive|     4|   6|   2|
+-----+------+----+----+

请注意,StructType 返回类型的使用是可选的,并且不一定是解决方案的一部分。

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

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

返回一个StructType,只需使用Row

from pyspark.sql.types import StructType,StructField,IntegerType,Row
from pyspark.sql import functions as F

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用UDF添加多列? 的相关文章

随机推荐

  • 我可以在没有公共 IP 的情况下为 Azure 虚拟机提供 Internet 访问权限吗?

    我在azure上有3个debian VM 其中一个有一个可以上网的公共IP VM 1 其他只有内部网络 VM 2 VM 3 我可以通过 VM 1 授予对 VM 2 或 VM 3 的访问权限吗 让我崩溃的是看到 VM 1 有 2 个网络接口
  • 制作 Laravel 集合的副本

    我正在尝试提供一份集合的副本users到一个雄辩的模型jobs 所以我实际上有 jobs 1 users 1 2 3 2 users 1 2 3 一旦我得到这个 我将对另一个查询中的一些数字进行求和 本质上为每个作业的每个用户提供一个总数
  • 使用 SQL 查询在 DB2 中插入 BLOB 数据

    我遇到了这样的情况 我需要通过从 DB2 Windows 7 上的 DB2 Express C 中的文件系统读取文件来将数据插入到 blob 列中 我在互联网上的某个地方找到了这个INSERT INTO VALUES readfile fi
  • Windows 身份验证混合

    我正在对 Intranet MVC 应用程序使用 Windows 身份验证 我想在身份验证过程中添加额外的逻辑 换句话说 用户除了存在于 AD 中之外 还必须存在于自定义数据库中才能进行身份验证 他们还应该注销 MVC 应用程序 然后使用相
  • RegexBuddy 的免费替代品 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何好的替代方案支持以不同风格编写正则表达式并允许您测试它们 以下是线程中提到的正则表达式工具的
  • 当使用 grunt 构建项目时,Fontawesome 无法工作

    我正在使用很棒的字体库字体 当项目不是用 grunt 构建 丑化时它可以工作 但是当我用 grunt 构建项目时 它不起作用 我在控制台中收到此错误 fonts fontawesome webfont woff v 4 0 3 404 未找
  • Visual Studio 2013团队项目已被删除

    在 vs 2013 中向源代码管理添加新的 Web 解决方案并首次签入后 我收到此错误 TF402484 The PROJECTNAME team project has been deleted Undo any pending chan
  • 将 JAX-WS 2.2.5 客户端与 JDK/JRE 1.5 结合使用

    Java 6 附带 JAX WS 2 0 据我所知 Java 5 并未附带 JAX WS 我能够将 JAX WS 2 2 5 与 Java 1 6 结合使用 通过使用Java认可的覆盖机制 https docs oracle com jav
  • PHP 生成的不完整时区列表

    我尝试生成中指定的完整时区集http php net manual en timezones php http php net manual en timezones php UTC 除外 使用以下代码 zones timezone ide
  • 如何在 Windows 上设置 Eclipse + StatET + Rcpp

    当我知道我可以使用 Rcpp 用 C 创建 R 包时 我感到很兴奋 并渴望了解它的开发环境 并感谢秋季统计博客 http blog fellstat com p 170 我可以使用 Eclipse 和 StatET 它的 R 插件 快速建立
  • 如何将 v-for 的值绑定到 v-if

    我正在使用 BootstrapVue 对于我的问题 我有一个v for在我的模板中有两个buttons 循环我的v for my v if不生成唯一的IDs单击一个按钮后 每个按钮都会被触发 from Open me to Close me
  • Heroku Godaddy 裸域 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个 Heroku 应用程序 并且添加了 CNAME www 到 herokuapp 以将其从 GoDaddy 重定向到 Heroku
  • 嵌套 VB (VBA) 枚举

    好吧 伙计们 我想实现嵌套枚举的效果 以便轻松对一些常量字符串进行分组 类似于下面的伪代码 Enum gKS Colby Hello Hays World end Enum Enum gMA Dodge Seven Muscatine Po
  • jQuery,未捕获的类型错误

    我的网页上有一些 javascript 代码 正在将一些 div 加载到页面上 我还想向每个 div 添加 onmouseenter 和 onmouseleave 事件处理程序 我正在使用 jquery 添加这些处理程序 但出现错误 对象
  • 在 WP 上使用 MvvmCross 拍摄图像并显示图像时出现问题

    我想用相机拍照并将其显示在我所在的页面上 所以我有一个 ViewModel 我可以在其中拍照并显示它 public class CamViewModel MvxViewModel IMvxServiceConsumer
  • Docker 运行 -p ?/? (这两个端口号是什么以及它们代表什么)

    我使用命令 docker run p 8080 8080 name my local image 但失败 提示无法在本地找到图像 8080 8080 最新 8080 8080 这两个端口到底代表什么 替换这个 p 8080 8080 这样
  • 在Mac上编译ARM .s文件

    我使用的是 Mac Os X 但在编译 s ARM 汇编文件时遇到问题 我的 s 文件是这样的 mov r0 r1 只是看看它是否有效 但当我这样做时arm elf as my s我得到一个a out文件 我愿意chmod x a out
  • 我们可以从 requirejs 中的模块导出多个非 AMD 函数吗?

    如果我有一个名为的非 AMD 模块old js在这个脚本中我有两个函数f1 and f2定义的 我需要使用它们 如何导出两者 require config paths jquery https ajax googleapis com aja
  • Xcode 6.3/iOS 8.3 中的新增功能:使用自分配以方便构造函数会导致构建错误

    此代码在 Xcode 6 2 和 6 3 之间没有更改 但包含的行 self alloc 现在导致错误 Multiple methods named initWithType found with mismatched result par
  • 如何使用UDF添加多列?

    Question 我想将 UDF 的返回值添加到单独列中的现有数据帧中 我如何以足智多谋的方式实现这一目标 这是我到目前为止所拥有的一个例子 from pyspark sql functions import udf from pyspar