You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Databricks中拆分Spark DataFrame扭矩列并解决空值问题

解决方案:处理Spark DataFrame中多格式torque列拆分问题

你的代码出现空值的核心原因是:

  • 仅用@拆分字符串,无法处理用at分隔的格式(如22.4 kgm at 1750-2750rpm)
  • 提取rpm的正则过于严格,无法匹配带逗号、括号的非标准rpm格式(如2,700(kgm@ rpm))
  • 单位提取逻辑仅从@前的部分取值,忽略了单位在@后的情况(如12.7@ 2,700(kgm@ rpm))

下面是适配所有给定格式的PySpark代码,能精准拆分出Nm和rpm列:

from pyspark.sql.functions import regexp_extract, trim, when, coalesce, concat, lit, col

# 假设你的DataFrame名为cars,torque列为目标列
df = cars

# 提取rpm部分:匹配@或at分隔符后的所有内容,去除首尾空格
df = df.withColumn("rpm", trim(regexp_extract(col("torque"), r'(?:@|at)\s*(.*)', 1)))

# 分三种情况提取Nm列内容
# 情况1:匹配带Nm的格式(如190Nm@ 2000rpm)
df = df.withColumn("nm_case1", trim(regexp_extract(col("torque"), r'(\d+\.?\d*Nm)', 1)))
# 情况2:匹配带kgm的格式(如22.4 kgm at 1750-2750rpm)
df = df.withColumn("nm_case2", trim(regexp_extract(col("torque"), r'(\d+\.?\d*\s*kgm)', 1)))
# 情况3:匹配仅数字@xxx的格式(如12.7@ 2,700(kgm@ rpm)),自动添加Nm单位
df = df.withColumn(
    "nm_case3",
    when(trim(regexp_extract(col("torque"), r'^(\d+\.?\d*)@', 1)) != "",
         concat(trim(regexp_extract(col("torque"), r'^(\d+\.?\d*)@', 1)), lit("Nm")))
)

# 合并三种情况的结果,得到最终的Nm列
df = df.withColumn("Nm", coalesce(col("nm_case1"), col("nm_case2"), col("nm_case3")))

# 清理中间临时列和原torque列
df = df.drop("torque", "nm_case1", "nm_case2", "nm_case3")

# 展示结果
df.display()

代码说明:

  • rpm列提取:用(?:@|at)\s*(.*)匹配两种分隔符,捕获分隔符后的全部内容,确保兼容所有格式的rpm信息
  • Nm列提取:
    • 针对不同格式分别匹配,用coalesce自动取第一个非空的匹配结果
    • 对无单位的数字格式自动补充Nm,符合你的目标输出要求
  • 空格处理:全程用trim去除多余空格,保证输出格式整洁

内容的提问来源于stack exchange,提问作者Abhilash Ahirekar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:14:58