在 PySpark 中以可扩展的方式链接多个 WHEN 条件

2024-01-02

我有一本字典(变量pats) 与许多when参数:条件和值。

from pyspark.sql import functions as F
df = spark.createDataFrame([("ė",), ("2",), ("",), ("@",)], ["col1"])

pats = {
  r"^\d$"          :"digit",
  r"^\p{L}$"       :"letter",
  r"^[\p{P}\p{S}]$":"spec_char",
  r"^$"            :"empty"
}

whens = (
    F.when(F.col("col1").rlike(list(pats.keys())[0]), pats[list(pats.keys())[0]])
     .when(F.col("col1").rlike(list(pats.keys())[1]), pats[list(pats.keys())[1]])
     .when(F.col("col1").rlike(list(pats.keys())[2]), pats[list(pats.keys())[2]])
     .when(F.col("col1").rlike(list(pats.keys())[3]), pats[list(pats.keys())[3]])
     .otherwise(F.col("col1"))
)
df = df.withColumn("col2", whens)

df.show()
# +----+---------+
# |col1|     col2|
# +----+---------+
# |   ė|   letter|
# |   2|    digit|
# |    |    empty|
# |   @|spec_char|
# +----+---------+

我正在寻找一种可扩展的方法chain一切when条件,所以我不需要为每个键都写一行。


  • Without reduce

    whens = F
    for k, v in pats.items():
        whens = whens.when(F.col("col1").rlike(k), v)
    whens = whens.otherwise(F.col("col1"))
    

    完整代码:

    from pyspark.sql import functions as F
    df = spark.createDataFrame([("ė",), ("2",), ("",), ("@",)], ["col1"])
    
    pats = {
      r"^\d$"          :"digit",
      r"^\p{L}$"       :"letter",
      r"^[\p{P}\p{S}]$":"spec_char",
      r"^$"            :"empty"
    }
    
    whens = F
    for k, v in pats.items():
        whens = whens.when(F.col("col1").rlike(k), v)
    whens = whens.otherwise(F.col("col1"))
    
    df = df.withColumn("col2", whens)
    
    df.show()
    # +----+---------+
    # |col1|     col2|
    # +----+---------+
    # |   ė|   letter|
    # |   2|    digit|
    # |    |    empty|
    # |   @|spec_char|
    # +----+---------+
    
  • Using reduce

    from functools import reduce
    
    whens = reduce(
        lambda acc, p: acc.when(F.col("col1").rlike(p), pats[p]),
        pats.keys(),
        F
    ).otherwise(F.col("col1"))
    

    完整代码:

    from pyspark.sql import functions as F
    from functools import reduce
    df = spark.createDataFrame([("ė",), ("2",), ("",), ("@",)], ["col1"])
    
    pats = {
      r"^\d$"          :"digit",
      r"^\p{L}$"       :"letter",
      r"^[\p{P}\p{S}]$":"spec_char",
      r"^$"            :"empty"
    }
    
    whens = reduce(
        lambda acc, p: acc.when(F.col("col1").rlike(p), pats[p]),
        pats.keys(),
        F
    ).otherwise(F.col("col1"))
    
    df = df.withColumn("col2", whens)
    
    df.show()
    # +----+---------+
    # |col1|     col2|
    # +----+---------+
    # |   ė|   letter|
    # |   2|    digit|
    # |    |    empty|
    # |   @|spec_char|
    # +----+---------+
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PySpark 中以可扩展的方式链接多个 WHEN 条件 的相关文章

随机推荐

  • 如何处理服务器和本机 Android 应用程序之间的时区差异?

    假设我的服务器位于美国 而我住在俄罗斯 我们知道他们有不同的时区 我的应用程序获取文本 String 来自服务器 这个文本数据有Date数据库中的列用于保留记录日期 当我获取数据时 我也得到date知识 这样我就可以按时间对它们进行分组 第
  • 在哪里可以找到包含常见食物列表的文本列表或库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一个解析电子邮件的 Python 脚本 其中涉及在电子邮件文本中搜索常见食品的任何单词 我需要某种方法来确定单词是否确实是食物
  • Java 应用程序的零停机部署

    我正在尝试构建非常轻量级的解决方案 以实现 Java 应用程序的零停机部署 为了简单起见 我们假设我们有两台服务器 我的解决方案是使用 在 前面 一些负载均衡器 软件 我在这里考虑 HAProxy 在 背面 两台服务器 都运行 Tomcat
  • 创建用于集成测试的 oauth-token

    我们希望创建一个 持久 的令牌用于集成测试目的 我们通常使用 keycloak 来创建令牌 但我不认为有可能创建没有过期的令牌 以便可以在开发阶段不间断地进行重复的集成测试 对于这种关于 oauth 的自动重复测试 您有何建议 所有访问令牌
  • 无论“delay”参数如何,Vue 异步组件都会毫无延迟地加载

    我在用高级异步组件 https v2 vuejs org v2 guide components html Advanced Async Components加载async component加载应用程序后 所以我尝试了以下代码 索引 vu
  • R SVM alpha 系数

    我正在尝试从 PMML 文件在 R 中重新创建 SVM 对象 但无法理解 R 如何存储 alpha 系数 我目前正在 iris 数据集上测试它 并使用以下命令生成了一个 R SVM 对象 library e1071 data iris mo
  • Android 通过 AT 命令与 HFP 设备通信

    我正在尝试通过 Android 中的 HFP 免提配置文件 控制具有振动功能的蓝牙手环 我已经能够连接到手环并访问输入和输出流 我的目标是模拟来电 以便蓝牙手环开始振动 这似乎是唯一的方法 为此 我使用 AT 命令 在蓝牙规格中https
  • Xcode 5.1:缺少所需的架构 arm64

    刚升级到Xcode 5 1 出现以下错误 忽略文件 依赖项 SalesforceNetworkSDK libSalesforceNetworkSDK a 文件中缺少所需的架构 arm64 依赖项 SalesforceNetworkSDK l
  • MD5解码。他们是如何做到的?

    我认为 不可能解码 md5 哈希值 但我找到了可以解码它们的工具here http md5 web max ca 但我不知道他们是如何在这么短的时间内做到这一点的 大约需要一秒钟 请帮助我理解它 Thanks 它不会解码 MD5 哈希值 它
  • 当无效值传递给 Props 时,TypeScript 不会抛出错误

    const enum ColumnValues one 1 two 2 three 3 interface Props style StyleProp
  • 无法加载,因为未找到支持的源。播放 HTML5 音频元素时[重复]

    这个问题在这里已经有答案了 我有 HTML5 音频元素
  • 如何从数组中获取多个键之间的最大值

    如何从数组中获取多个键之间的最大值 我已经尝试过以下方法只有三个 不是多个 钥匙 getMaxValuefromkeys values any key1 string key2 string key3 string var val1 Mat
  • 保存/加载 iPhone 游戏数据的最佳方式

    我正在开发一款益智游戏 游戏引擎拥有复杂的对象层次结构 从游戏演员到矢量再到过渡动画 根据游戏状态 它们的总数可能从 10 到 1000 在极端情况下 我一直在推迟这个时刻 直到我必须致力于保存和加载所有这些混乱的事情 因为我在这方面没有经
  • java 邮件轮询从邮件中读取内联或嵌入图像(笑脸)

    我是java邮件轮询的新手 我已经创建了一种类型的对话应用程序 如果用户互相发送邮件 然后我从他们那里读取邮件并将其作为对话中的新消息发布 现在的问题是 如果有表情符号 内联或嵌入图像该怎么办 例如 在 gmail 邮件中 我们现在也可以发
  • 如何在 Maven 项目中使用 -Xlint:unchecked 进行编译?

    在 NetBeans 7 2 中 我无法找到如何在 Maven 项目中使用 Xlint unchecked 进行编译 在 Ant 项目下 您可以通过转到 项目属性 gt 编译 来更改编译器标志 但 Maven 项目似乎没有任何此类选项 有什
  • Rails 4 多文件上传解决方案

    有人有解决方案吗 你能给我指出一个不是的吗 http railscasts com episodes 381 jquery file upload http railscasts com episodes 381 jquery file u
  • 如何解析格式错误的 HTML 文件?

    我必须解析一系列网页才能将数据导入应用程序 每种类型的网页都提供相同类型的数据 问题在于每个页面的 HTML 不同 因此数据的位置也不同 另一个问题是 HTML 代码的格式很差 导致无法使用类似 XML 的解析器 到目前为止 我能想到的最好
  • pom.xml 和 web.xml 的 Web 项目之间的区别

    具有 pom xml 和 web xml 的 Java 项目有什么区别 项目可以同时拥有这两种配置吗 它们完全兼容 事实上 他们执行完全不相关的任务 pom xml is the Maven 项目的配置文件 http maven apach
  • Chrome 打印空白页

    如果用户单击缩略图 我有一个旧的 JavaScript 代码可以打印图像 它曾经工作得很好 但最近 仅在 Chrome 中 预览中有一个空白页面 下面是 JsBin 中的演示 http jsbin com yehefuwaso 7 http
  • 在 PySpark 中以可扩展的方式链接多个 WHEN 条件

    我有一本字典 变量pats 与许多when参数 条件和值 from pyspark sql import functions as F df spark createDataFrame 2 col1 pats r d digit r p L