PySpark中从现有列右侧提取可变长度字符创建新列的教程


PySpark中从现有列右侧提取可变长度字符创建新列的教程

本教程详细介绍了如何在pyspark dataframe中,从现有列的右侧,根据特定模式(如连字符后的数字部分)提取可变长度的字符串并创建新列。文章将重点讲解如何利用`pyspark.sql.functions.regexp_extract`函数结合正则表达式,高效且灵活地实现这一数据处理需求,并提供详细的代码示例与注意事项。

PySpark中基于模式提取可变长度字符串并创建新列

在数据处理和分析中,我们经常需要从现有的字符串列中提取特定部分来生成新的特征列。当需要提取的部分长度不固定,且其位置由某种模式(例如,分隔符后的内容)决定时,常规的固定长度截取方法往往力不从心。本文将介绍在PySpark环境中,如何利用强大的正则表达式功能,结合regexp_extract函数,优雅地解决这一挑战。

场景描述

假设我们有一个PySpark DataFrame,其中包含一个名为Product的列。该列的字符串格式为“产品名称 - 数字编码”,其中产品名称和数字编码的长度都是可变的,且可能包含多个连字符,但我们总是希望提取最后一个连字符后的纯数字部分作为新的UPC列。

原始数据示例:

Product Name
abcd - 12 abcd
xyz - 123543 xyz
xyz - abc - 123456 xyz - abc

期望输出示例:

Product UPC
abcd - 12 12
xyz - 123543 123543
xyz - abc - 123456 123456

传统方法面临的挑战

一些用户可能会尝试使用length、locate和substring等函数来计算连字符的位置和字符串长度,进而截取所需部分。例如:

# 尝试使用 substring 组合函数 (可能导致复杂性和错误)
# df4 = df3.withColumn("LastHyphen", length(col("PRODUCT")) - locate('-', reverse(col("PRODUCT"))))
# df4 = df4.withColumn("ProductLength", length(col("PRODUCT")))
# df4 = df4.withColumn("UPC", substring("PRODUCT", df4.LastHyphen, df4.ProductLength - df4.LastHyphen))
# 这种方法在处理列类型参数时可能遇到 'Column is not iterable' 等类型错误,
# 且逻辑复杂,难以应对更复杂的模式匹配。

这种方法不仅实现起来较为繁琐,需要多步计算,而且在处理动态计算的列作为substring函数的参数时,可能会遇到类型不匹配或迭代器相关的错误。更重要的是,它对模式的适应性较差,一旦模式稍有变化,就需要大幅修改逻辑。

解决方案:使用 regexp_extract

PySpark提供了pyspark.sql.functions.regexp_extract函数,它允许我们使用正则表达式从字符串中提取匹配特定模式的部分。这对于处理可变长度、基于模式的字符串提取任务非常高效和灵活。

regexp_extract函数的语法为:regexp_extract(col, pattern, idx)。

Freepik Mystic Freepik Mystic

Freepik Mystic 是一款革命性的AI图像生成器,可以直接生*高清图像

Freepik Mystic 174 查看详情 Freepik Mystic
  • col: 要操作的字符串列。
  • pattern: 用于匹配的正则表达式字符串。
  • idx: 如果正则表达式包含捕获组(用括号()定义),则此参数指定要提取哪个捕获组的内容。0表示提取整个匹配项,1表示提取第一个捕获组,依此类推。

示例代码

首先,我们创建一个示例DataFrame:

from pyspark.sql import SparkSession
from pyspark.sql import Row
from pyspark.sql.functions import col, regexp_extract

# 初始化SparkSession
spark = SparkSession.builder.appName("ExtractVariableLengthSubstring").getOrCreate()

# 创建示例数据
data = [
    Row(product="abcd - 12", name="abcd"),
    Row(product="xyz - 123543", name="xyz"),
    Row(product="xyz - abc - 123456", name="xyz - abc"),
    Row(product="no hyphen product", name="no hyphen"), # 演示无匹配情况
    Row(product="product - only text", name="text after hyphen") # 演示非数字情况
]
df = spark.createDataFrame(data)

print("原始DataFrame:")
df.show()

输出:

原始DataFrame:
+-------------------+-----------------+
|            product|             name|
+-------------------+-----------------+
|          abcd - 12|             abcd|
|       xyz - 123543|              xyz|
| xyz - abc - 123456|        xyz - abc|
|  no hyphen product|        no hyphen|
|product - only text|text after hyphen|
+-------------------+-----------------+

接下来,我们应用regexp_extract来提取UPC:

# 定义正则表达式
# ".* - ([0-9]{1,})" 的解释:
# .*        : 匹配任意字符(除了换行符)零次或多次。这会贪婪地匹配到最后一个 " - " 之前的所有内容。
#  -        : 匹配字面量 " - "(一个空格,一个连字符,一个空格)。
# ([0-9]{1,}): 这是一个捕获组。
#   [0-9]   : 匹配任何数字 (0-9)。
#   {1,}    : 匹配前面的元素(即数字)一次或多次。
#            因此,这个捕获组会匹配最后一个 " - " 之后的一个或多个数字。
# 我们需要提取第一个捕获组的内容,所以 idx 为 1。
upc_pattern = r".* - ([0-9]{1,})"

# 使用 withColumn 和 regexp_extract 创建新列
df_with_upc = df.withColumn("UPC", regexp_extract(col("product"), upc_pattern, 1))

print("提取UPC后的DataFrame:")
df_with_upc.show()

# 停止SparkSession
spark.stop()

输出:

提取UPC后的DataFrame:
+-------------------+-----------------+------+
|            product|             name|   UPC|
+-------------------+-----------------+------+
|          abcd - 12|             abcd|    12|
|       xyz - 123543|              xyz|123543|
| xyz - abc - 123456|        xyz - abc|123456|
|  no hyphen product|        no hyphen|      |
|product - only text|text after hyphen|      |
+-------------------+-----------------+------+

从结果可以看出,对于不符合模式的行(如no hyphen product和product - only text),regexp_extract会返回一个空字符串,这是其默认行为。

注意事项

  1. 正则表达式的精准性:正则表达式是解决此类问题的核心。一个设计良好的正则表达式能够准确捕获目标数据,同时避免意外匹配。.*是贪婪匹配,它会尽可能多地匹配字符,这在这里确保我们匹配到的是最后一个连字符。
  2. 捕获组索引:确保regexp_extract的第三个参数idx正确指向你希望提取的捕获组。0代表整个匹配项,1代表第一个捕获组。
  3. 模式不匹配的处理:当源字符串不符合正则表达式模式时,regexp_extract将返回一个空字符串。在实际应用中,你可能需要进一步处理这些空值,例如使用when和otherwise函数进行条件赋值,或者进行数据清洗。
  4. 性能考量:正则表达式匹配通常比简单的字符串操作(如substring、split)计算成本更高。对于大规模数据集,如果性能成为瓶颈,应评估其影响。然而,对于大多数模式匹配和提取任务,regexp_extract通常是效率和灵活性的最佳平衡点。
  5. 转义字符:在Python字符串中定义正则表达式时,使用原始字符串(前缀r,例如r"pattern")可以避免反斜杠\的二次转义问题。

总结

在PySpark中,当需要从字符串列中提取可变长度、基于复杂模式的子字符串时,pyspark.sql.functions.regexp_extract函数结合正则表达式是功能强大且高效的首选方案。它不仅简化了代码逻辑,提高了可读性,而且能够灵活应对各种复杂的字符串解析需求。通过精确构建正则表达式,我们可以轻松地从非结构化或半结构化的文本数据中提取出有价值的信息,为后续的数据分析和建模奠定基础。

以上就是PySpark中从现有列右侧提取可变长度字符创建新列的教程的详细内容,更多请关注其它相关文章!


# 正则表达式  # 网站排名优化 常問宙m思速来  # 定西市app网站建设  # 宣城网站建设口碑哪家好  # 宝山区大型网站建设  # 廉江农村住房建设网站  # 不符合  # 数据处理  # 几种  # 浮点  # 多个  # 这一  # 的是  # 第一个  # 串列  # 字符串解析  # 数据清洗  # session  # app  # 编码  # python  # 惠州网站建设臻动传媒  # 鹤壁整站seo关键词排名公司  # 佛山个人网站推广价格  # 营销推广费的现金流  # 光伏公司网站建设 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 咸鱼怎么设置仅粉丝可见的动态_咸鱼动态粉丝可见设置方法  msn官方入口2025登录 msn官网2025直达首页入口  todesk如何添加信任设备_todesk信任设备设置教程  《搜书吧》阅读书籍方法  Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程  海棠书屋官方在线书籍入口 海棠书屋文学作品浏览官网链接  苹果官网国补入口在哪  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别  如何在CSS中实现盒模型多列间距_grid-gap与padding结合  个人所得税办理入口 个人所得税综合所得年度汇算入口  c++如何实现观察者设计模式_c++行为型设计模式实战  Final Cut Pro视频加EQ教程  QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务  风神瞳获取全攻略  猫眼电影app如何设置电影上映提醒_猫眼电影上映提醒设置教程  研招网官方网站正版登录网址_中国研究生招生信息网官网首页  邮政快递寄件查询入口 邮政快递收件查询入口  CDR如何复制交互式填充色  PHP utf8_encode 字符编码转换陷阱与解决方案  海棠阅读登录教程_详细讲解海棠登录操作  Leaflet地图弹出窗口图片动态显示:避免缺失图标的专业指南  手机坏了微信聊天记录怎么导出来 新手机恢复聊天记录技巧  高效调试PHP大型嵌套数组:JSON序列化与可视化工具实践  谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接  J*a里如何处理ArithmeticException并防止除零_算术异常防护策略解析  sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码  mysql怎么导入sql文件_mysql导入sql文件的方法与技巧  一加 Ace 6V 快充无法启用_一加 Ace 6V 充电优化  wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式  Mac怎么关闭按键声音_Mac键盘打字音效设置  《procreate》绘制渐变效果教程  C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较  电脑从睡眠中被自动唤醒怎么办_Windows唤醒源事件查看与禁用【解决】  行者app怎样导出日志  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  《百度畅听版》关闭兴趣推荐方法  Magento 2 产品保存事件中安全更新属性的最佳实践  猫眼app抢票快还是小程序快  win11讲述人怎么关闭 Win11屏幕朗读辅助功能禁用方法【技巧】  百度网盘如何设置上传限额  J*aScript对象中深度嵌套URL键的查找与更新策略  修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现  以下哪一个是适应长期护理制度发展而设立的新职业  如何在CSS中设置背景图像:一个全面指南  金牛福袋获取攻略  Golang如何初始化module项目_Golang module init使用说明  谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程  sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程  江苏大剧院会员卡购买步骤 

 2025-12-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.