如何在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
相关产品推荐
相关产品推荐

